odoo 中的 model 主要有三个, 分別是 AbstractModel、Model、TransientModel
AbstractModel:抽象化model,用于report较多,并不会在db中产生table
Model,也就是最基本的 BaseModel
TransientModel:暂存的model,在特定时间会从dbz中删除
(在创建model生成表时,会有四个字段继承了AbstractModel自动创建,分别是:
id字段:主键字段
create_uid字段:创建用户的uid
create_date字段:数据的创建时间
write_uid字段:上一次更新的用户uid
write_date字段:上一次更新的时间
)
字段介绍
例如:
from odoo import models, fields, api
class Info(models.Model):
_name='org.info'
_description = '组织信息'
_inherit = ['mail.thread', 'mail.activity.mixin'] # track_visibility
name = fields.Char(string="组织名称")
social_credit_code = fields.Char(string="社会信用代码")
org_manager = fields.Char(string="组织管理员")
其中:_name为model的名称,建议都使用单数,然后不要使用_分割名称,一般都是使用 . 分割
_description 是表名
_inherit 是继承,在 odoo 中不管是 model 還是 view, 甚至是权限, 都会使用继承
类名是驼峰式,字段名是下划线式
字段属性介绍
如:
is_done_track_onchange = fields.Boolean(string='Is Done?', default=False, track_visibility='onchange')
其中: track_visibility 为追踪值的改变,这也是为什么要继承mail.thread 以及 mail.activity.mixin 的原因,
如果你有修改值, 会记录改变。
gender=fields.Selection("bender",related="employee_id.gender ")
其中:fields.Selection知识下拉选择框,比较特别的是related.
employee_id.gender意思是会自己去找employee_id中的gender
Related预设的field是不会存储在db中的,默认store=False
在table中找不到gender字段的,如果想存在,需要把store=True
然后它的readonly默认是True,意思是不可用去修改的(如果想要修改,需要去employee中找到gender进行修改)
关系字段介绍
many2one:多对一
如:department_id = fields.Many2one(“org.department”, “部门”)
其中:org.department代表关联的model(必填);在db中会有字段department_id
其中:
one2many:一对多
如:members=fields.One2many(“org.member”,“department_id”,“负责人”)
其中:org.member代表关联的model(必填);department_id代表所关联model的field(必填),也就是说要建立One2many,一定要有一个many2one,但是建立many2one,则不一定要有One2many。
One2many是一个虚拟的栏位,在数据库中是看不到它存在的。
many2many:多对多
先定义两个model:demo.tag、demo.expense.tutorial
在demo.expense.tutorial中设置字段如下:
tag_ids=fields.Many2many(“demo.tag”,“demo_expense_tag”,“demo_expense_id”,“tag_id”,“负责人”)
其中:demo.tag代表comodel_name,即需要关联的model; demo_expense_tag代表relation,即db中新生成的关联表名,因为many2many会多出一个table,这里是对table进行命名,如果没填relation值,则会自动生成一个表名:命令规则是:model名称+comodel_name+_rel,即:demo.expense.tutorial_demo_tag_rel;
demo_expense_id代表colunm1,即demo.expense.tutorial中table对应的id;
tag_id代表colunm2,即demo.tag中table对应的id
binary
Binary:二进制类型,用于保存图片、视频、文件、附件等
odoo 中没有直接的图片 image 字段,但是有一个 binary 二进制字段
LOGO_img = fields.Binary(u"品牌LOGO地址", api=True)
xml 文件添加图片标签属性widget=“image”
<group>
<field name="image" widget="image" class="oe_avatar"/>
</group>
Compute字段
compute字段不是一种字段类型,而是指某个字段的值是计算出来的。
一个字段的值,可以通过一个函数来动态计算出来。定义格式如下:
字段名=fields.类型(compute="函数名",store=True/false) #store定义了该动态改变的字段值是否保存到数据库表中
@api.depends(依赖的字段值)#depend的字段值一旦发生变化,就会触发该函数,从而更新compute字段值。
def 函数(self):
self.字段=计算字段值
例如:
employees=fields.One2many("ogsp.employee","department", string="员工列表", api=True)
# 修改employee_num (store=True) 注意:employee_num在数据库中都是null
employee_num = fields.Integer(compute="_compute_employee_num",string="部门人数", api=True)
# @api.depends(employees)
# @api.multi
def _compute_employee_num(self):
for record in self:
record.employee_num=len(record .employees)