odoo模型逻辑学习笔记

创建模型

模型属性:模型类可以使用一些属性来控制它们的一些行为:

_name :创建odoo模型的内部标识符,必含项。

_description :当用户界面显示模型时,一个方便用户的模型记录标题。

_order :当浏览模型记录或者显示在列表视图时,设置默认顺序。

_rec_name:用来指出引用关联字描述记录的字段,例如多对一关系。 默认情况下,它使用name字段,这是模型中常见的字段。但是这个属性允许我们使用任何其他字段来实现这个目的。

_table:用来支持模型的数据库表名。通常,它是左自动计算,是下划线取代点的模型名称,但也可以设置特定的表名。

_inherit :继承。

_inherits :嵌入式继承。

模型深入

Odoo模型由Python类表示。

Odoo模型被保存在一个中央注册中心,它可以引用实例中可用的所有模型类,并且它可以被一个模型名引用。在我们编写的模型方法代码中,可以通过 self.env['x'] 获取一个代表model x的类的引用。(相当于spring托管对象)

模型名称很重要,因为它们是用于访问注册中心的。模型名称的约定规则:用点分隔的小写字母列表。

模型名称必须是全局唯一的。正因为如此,第一个词应该对应于该模块涉及到的主要应用程序。
瞬态和抽象模型:

绝大多数Odoo模型中,类都是基于models.Model类的。 这种类型的模型具有永久的数据库持久性:为它们创建数据库表,并且它们的记录被存储,直到被显式删除。

Odoo还提供了另外两种模型类型:瞬态模型和抽象模型。

瞬态模型基于models.TransientModel类,用于向导式的用户交互。 它们的数据仍然存储在数据库中,但期望是临时的。 一个清理作业定期从这些表中清除旧数据。 
抽象模型基于models.AbstractModel类,并且它不存储数据。 抽象模型作为可重用的功能集,利用Odoo的继承功能,混入到其他模型。

模型之间的关系

命名字段时,有以下约定:以_id、_ids为结尾命名的字段,分别对应的是2one和2many的关系。

多对一关系:Many2one关系需要两个参数:关联模块和展示字符。它会在数据库表中创建一个拥有外键的字段去关联数据库表。

ondelete 在关联的记录被删除时,将会触发。默认值是null,也就是说,当关联的记录被删除时,它将被置空。值为restrict,当记录被关联时,禁止删除,值为cascade,删除关联记录的同时删除当前记录。

context是一个数据字典,在web客户端视图,通过关联关系访问时,会将上下文传过去。

domain是一个由多个元组组成的列表的域表达式,用来删选关联字段中有效的记录。

auto_join=True使用这个参数后,将允许ORM在数据查询是使用SQL的join(拼接,级联)功能。

多对多关系:Many2many 最少要提供一个参数,也就是关联的模块,建议再使用string参数,以便更好的标题展示。
多对多关系的存储:在数据库层面,数据库表中是不会添加任何字段。它会自动的创建一个新的中间表,这个表只有两个外键ID字段,并且这两个字段分别关联对应的数据库表。

一对多反向关系:One2many按顺序接收3个参数:关联的模块,关联模块的字段名称,标题文本。最开始的两个参数通常是模块名和相反关系对应的外键字段名。

分层关系:树型存储。

_parent_store = True
# _parent_name = 'parent_id'
parent_id = fields.Many2one('todo.task.tag', 'Parent Tag', ondelete='restrict')
parent_left = fields.Integer('Parent Left', index=True)
parent_right = fields.Integer('Parent Right', index=True)
#添加一个子记录
child_ids = fields.One2many('todo.task.tag', 'parent_id', 'Child Tags')

计算字段

要创建计算字段,需要设置它的compute属性为方法名。这个计算方法通过计算self的每条记录来设置字段的值。

计算字段就像常规字段一样声明,但是有额外的compute参数,参数值是一个函数名,在函数中计算值并返回。

当计算依赖于其他字段时,需要@api.depends装饰器。

计算字段的值通常取决于所在记录行的其它字段的值。ORM层期望开发人员使用depends()装饰器来指定计算方法的依赖性。当某些依赖关系被修改后,ORM层通过给定的依赖关系来触发字段的重新计算

一种用法:统计一对多字段的长度,得到关联人数:

onchange:【onchange相当于前端的js函数!】

"onchange"机制为客户端界面提供了一种方法:当用户在字段中填写了值,不需要向数据库保存任何内容,就可以更新表单。

例如,假设模型有三个字段amount,unit_priceprice,当数量和单价改变时,自动重新计算价格,并在表单界面更新。要实现这个需求,需要定义一个方法,并使用onchange()装饰器,onchange()的参数指定了在那个字段改变时,触发方法。其中self代表表单视图中的记录,你所做的任何更改,self都将立刻反应在表单上。 

onchange也可以用于检测字段变化值是否合法。

搜索与写入:

计算字段可以通过计算得到字段值,但此时只能被读取显示,还不能被搜索或者写入。为此,我们需要实现函数,并通过字段的search参数、inverse参数来实现该字段的搜索与写入定义。

存储计算字段:通过设置“store= true”的定义,计算字段的值也可以存储在数据库中。

关联字段

模型约束

Python约束检查函数应该使用@api.constraints(被约束字段) 修饰,说明被检查的字段的列表。当其中任何一个被修改,并且在条件失败时将会抛出一个异常,验证就会被触发。

self.env

猜你喜欢

转载自blog.csdn.net/miantian180/article/details/81771721
今日推荐