odoo笔记

本文介绍了如何在后台使用nohup和Python脚本管理Odoo项目,包括重启、更新模型类、操作数据库(如ps、kill、pgAdmin、Nginx、SQL命令),以及提交代码更新和数据库配置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

后台运行项目

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

  1. 解压缩odoo16 源码

  2. 根目录有一个odoo-bin 是启动文件

  3. 创建虚拟环境,并安装所需的包 根目录自带requirements.txt

  4. pip install -r requirements.txt -i Simple Index

  5. 根目录创建自己的自定义模块 my_odoo

  6. 根目录下 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
  7. 初次运行加初始化 -i base,注释 addons_path

    python odoo-bin -c ./debian/odoo.conf -i base

  8. 配置Debug模式

  9. 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值