后台运行项目
nohup python odoo-bin -c ./debian/odoo.conf &
查看当前odoo进程 (更新项目模型类时,1.先重启项目,2.再去网页更新模块)
ps -fA | grep odoo kill 进程id
删库
/web/database/manager
查找文件夹
find /path/to/search -type d -name "static" find / -type d -name "static" # 所有路径下查找
pgAdmin
重启数据库
sudo systemctl restart postgresql
Nginx
Nginx 服务的状态 sudo systemctl status nginx.service Nginx 服务启动失败的信息 journalctl -xe
在线上my_odoo模块中提交代码更新
cd /home/odoo/odoo16/my_odoo git pull 623178111@qq.com zhangxiao999.
su jz
-
解压缩odoo16 源码
-
根目录有一个odoo-bin 是启动文件
-
创建虚拟环境,并安装所需的包 根目录自带requirements.txt
-
pip install -r requirements.txt -i Simple Index
-
根目录创建自己的自定义模块 my_odoo
-
根目录下 debian/odoo.conf
[options] ; This is the password that allows database operations: ; admin_passwd = admin db_host = 127.0.0.1 db_port = 5432 db_name = odoo_one db_user = zx db_password = 123456 default_productivity_apps = True addons_path = E:\odoo\odoo16\addons,E:\odoo\odoo16\my_odoo
-
初次运行加初始化 -i base,注释 addons_path
python odoo-bin -c ./debian/odoo.conf -i base
-
配置Debug模式
-
my_odoo/下创建一个模块:
python odoo-bin scaffold 模块名 路径/
可以放开注释了,debian/odoo.conf中 addons_path
odoo模型类
_sql_constraints = [ ('声明', 'unique(train_batch_number,student_id)', '说明!') ]
class fixassets_type(models.Model): _name = 'accountant.assets_type' # 模块名.模型类名 _description = '固定资产分类' # 模型的非正式名称,当用户界面显示
_ = fields.Datetime(string='记账日期') _ = fields.Float(string='税额', digits=(10, 2)) _ = fields.Integer(string='固定资产科目', required=True) _ = fields.Char(string='固定资产科目路径', required=True) _ = fields.Date(string='到货日期') _ = fields.Json(string='关联附件') _ = fields.Boolean(string='是否启用') _ = fields.Selection([ ('deitable', '可编辑'), ('under_review', '审核中'), ('withdrawn', '撤回中'), ('approved', '已审核'), ('cancelled', '已作废') ], string='单据状态') _ = fields.Selection([('固定成本', '固定成本'), ('先进先出', '先进先出'), ('加权平均', '加权平均')], string='成本计算方式') 取值方式 ->>> for i in cls: dic = { 'id': i.id, 'name': i.id, 'test1': dict(cls._fields['test1'].selection).get(i.test1), } # 多对一关系绑定对方模型类的 _name='' _ = fields.Many2one('accountant.assets_type', string='固定资产分类编号', ondelete='cascade', required=True) ondelete='cascade' 父级删除,子集跟着删除 及连操作 ondelete='restrict' 子级在 父级不可删除
Char 单行文本 Text 多行文本 Selection 下拉单选 Htmlhtml 富文本 Integer 整型 Float 浮点型 Monetary 货币型 Date 日期型 Datetime 日期+时间型 Boolean 布尔型 Binary 二进制文件类型 Many2one 多对一 One2many 一对多 Many2many 多对多
string 字段名称(str) default 默认值 help 帮助提示内容(str) readonly 是否为只读(boolean) required 是否为必填(boolean) unique 唯一(boolean) index 是否为索引字段(boolean) copy 是否为允许复制(boolean) related 关联字段, 表示本字段引用关联表中的某字段。 groups 定义可操作的用户组(str) domain 用于关联字段记录的过滤 store 是否存入数据库 默认为True compute 用于创建一个默认记录给指定字段,不可编辑,store默认为False inverse 操作compute的默认记录,反向操作给depends绑定的字段,且compute操作后的记录还是操作前的记录 related 关联字段, 表示本字段引用关联表中的某字段 groups 用户组,定义可操作的用户组(str) ondelete set null: 当b中删除记录时,modelA中相关记录的a=null ; ; ; cascade: 当b中删除记录时,modelA中相关记录也全部删除 ; ; ;restrict: 当b中删除记录时,如果modelA中存在对应记录,则无法操作 b 的删除;;;;;;;;;;;;;;;;;;;;;\;;;;;; ; 如果Many2one字段中没有设置ondelete属性,则默认为set null
odoo视图类
从请求中提取JSON数据
data = request.get_json_data()
GET传参
@http.route('/api/book/<int:book_id>', auth='none', type='http', methods=['GET'], csrf=False) def create_book(self,book_id): params=request.params params.get('name') kw.get('name')
POST传参
try: data = request.get_json_data() except Exception as e: return api_response(error=ERRORS.JSON_DATA_CHECK) data.get('name')
json传参
{"data": [ [1,"rdtfvby"], [1,"rdtfvby"], [1,"rdtfvby"], [1,"rdtfvby"], ] } @http.route('/api/questionnaireresults', auth='none', type='json', methods=['POST'], csrf=False) def get_questionnaireresults(self, **kw): event = json.loads(request.httprequest.data) print(event, '???????????') for i in event.get('data'): a = i[0] b = i[1] print(a, '--->', b) {'data': [[1, 'rdtfvby'], [1, 'rdtfvby'], [1, 'rdtfvby'], [1, 'rdtfvby']]} ??????????? 1 ---> rdtfvby 1 ---> rdtfvby 1 ---> rdtfvby 1 ---> rdtfvby
指定模型类
model = request.env['模型类名字']
search() search_read() search_count()
request.env['模型类名字'].sudo().search() >>>> search([(条件1),(条件2)],['限制只查询的字段'], order='id desc', offset=0, limit=1) 返回对象 取值用for循环 i.字段名 >>>> search_read() 返回数据 取值用for循环 i.get('字段名') >>>> search_count() 返回数据的总条数 >>>> 模糊查询 info_like = model_book.sudo().search_read([('name','ilike','周')]) >>>> examstudent_model.sudo().search([], order=['id desc'])
获取表中字段名
fields_list = list(request.env['course.coursekind'].fields_get().keys())
新建 :
>> 检查数据格式/验证数据 >> 父级存在才能创建 父表.sudo().search([('id', '=', 子parent_id)]) >> model.sudo().create(data)
删除:
>> 判断对象是否存在 >> 有子级不可删除 子表.sudo().search([('子外键', '=', 父id:要删除的id)]) >> info_one.unlink()
修改:
>> 判断对象是否存在 >> 检查数据格式/验证数据 kind.write(data)
详情:
>> search_read()查询数据 >> 存在就返回数据
全部列表页:
model = request.env['course.coursekind'] params = request.params domain, size, page = all_fields_Filter(model, params) data = request.env['course.coursekind'].sudo().search_read(domain, limit=size, offset=page) count = request.env['course.coursekind'].sudo().search_count(domain) return api_response(data=data, count=count)
自关联树形图:
model = request.env['course.coursekind'] params = request.params fields = ['id', 'name', 'parent_id'] data, count = TreeData().tree_list(model, params, fields) return api_response(data=data, count=count)
时间
# 获取上海时区 shanghai_tz = pytz.timezone('Asia/Shanghai') # 获取当前时间 datetime_now = datetime.datetime.now(shanghai_tz) # 移除时区 datetime_now = datetime_now.replace(tzinfo=None) # datetima 转分钟数 exam_time_end = examstu.ent_exam - datetime_now exam_time_end = int(exam_time_end.total_seconds() / 60)
apiPOST设置
在登录接口的后执行脚本中添加设置 apt.globals.set("token", response.json.data.token);
odoo数据库配置
odoo数据库配置文件 /home/odoo/odoo16/debian/odoo.conf
初始化数据库 ./odoo-bin -c /home/odoo/odoo16/debian/odoo.conf -d 数据库名 --addons-path=/home/odoo/odoo16/addons -u base --without-demo=ALL --init=base 重置密码 ./odoo-bin -c /home/odoo/odoo16/debian/odoo.conf -d odoo -u base --stop-after-init --init=admin_password:123456
postgresql数据库
启动服务 net start postgresql
超级用户:postgres 123456 普通用户:zx 123456
连接数据库 psql -U postgres 登录数据库 psql -h IP -p 端口 -U 用户名 -d 数据库名 -W
\? 所有命令帮助 \l 列出所有数据库 \d 列出数据库中所有表 \dt 列出数据库中所有表 \d [table_name] 显示指定表的结构 \di 列出数据库中所有 index \dv 列出数据库中所有 view \h sql命令帮助 \q 退出连接 \c [database_name] 切换到指定的数据库 \c 显示当前数据库名称和用户 \conninfo 显示客户端的连接信息 \du 显示所有用户 \dn 显示数据库中的schema \encoding 显示字符集 select version(); 显示版本信息 \i testdb.sql 执行sql文件 \x 扩展展示结果信息,相当于MySQL的\G \o /tmp/test.txt 将下一条sql执行结果导入文件中
修改密码 alter user 用户名 with password '需要修改的密码';
展示所有库名 select datname from pg_database;
创库 create database 数据库名 owner 所属用户 encoding UTF8;
删库 drop database 数据库名;
根据已有表结构创建表:
create table if not exists 新表 (like 旧表 including indexes including comments including defaults);
删除表:
drop table if exists "t_template" cascade;
新建用户并设置密码 createuser 用户名 with password '123456';
设置只读权限 alter user 用户名 set default_transaction_read_only = on;
设置可操作的数据库 grant all on database 数据库名 to 用户名;
授权可操作的模式和权限 -- 授权 grant select on all tables in schema public to 用户名; -- 授权 GRANT ALL ON TABLE public.user TO mydata; GRANT SELECT, UPDATE, INSERT, DELETE ON TABLE public.user TO mydata_dml; GRANT SELECT ON TABLE public.user TO mydata_qry;
索引: drop index if exists t_user_username; create index t_user_username on t_user (username);
创建唯一索引:
drop index if exists t_user_username; create index t_user_username on t_user (username);
查看索引:
\d t_user