odoo学习之model

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)
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值