Many2one
定义
每本书只有一个出版社,因此在图书和出版社之间可以使用 many-to-one 关联。
运行原理
Many-to-one字段向模型的数据表中添加了一列,存储关联记录的数据库ID。在数据库级别上,还会创建外键约束,确保保存的ID是对关联表中记录的有效引用 。对这些关联字段不会创建数据库索引,但这可通过添加 index=True 属性来进行完成。
属性
- ondelete
属性决定在关联记录删除时执行什么操作。例如,在出版社记录删除后图书会怎么样?默认值为’set null’,,会将该字段置为空值。也可以为’restrict’,会阻止关联字段的删除,或者是 ‘cascade’,这会导致关联的字段同样被删除。 - context
在点击字段进入关联记录视图时context会向客户端上下文添加变量。 - domain
用于限制可用的关联记录列表的搜索过滤器。 - auto_join
这个标记允许ORM对这个字段使用SQL连接(join)。因此它不受普通的ORM限制,如用户访问控制和记录权限规则。在具体的用例中,它可以解决性能问题,但建议尽量避免使用。
One2many
定义
每个出版社都可以出版多本书。因此对前面的many-to-one 关联进行反向则成为one-to-many 关联。
运行原理
One-to-many字段是many-to-one的反向关联,虽然它们像其它字段一样添加在模型中,在数据库中并没有实际的体现。他们仅是编程捷径,启用视图来展现这些关联记录列表。
属性
- comodel_name
这是目标模型标识符,对所有关联字段是强制的,但可以占位定义而无需使用关键字 - inverse_name
它仅应用于One2many,是反向Many2one关联的目标模型中的字段名 - limit
它在One2many和Many2many中使用,对在用户界面级别上用于记录读取的数量设置可选限制
Many2many
定义
每本书可以有多个作者。而反过来每位作者也可以写多本书。从任意一方看,这是一个many-to-many关联。
运行原理
Many-to-many关联也不会向模型数据表添加列。这类关联在数据库中使用中间关联表进行体现,其中有两列分别存储这两个关联的ID。在图书和作者之间添加新关联在这个关联表中使用图书ID和作者ID创建一条新记录。
Odoo自动处理这一关联表的创建。关联表的名称默认使用两个关联模型名按字母排序加上一个_rel后缀来创建。但我们可以使用relation属性来进行覆盖。
需要考虑的一种情况是两个表名过长导致自动生成的数据库标识符超过PostgreSQL的上限63个字符。按照经验,如果两个关联的表名超过23个字符时,应使用relation属性来设置一个更短的名称。
属性
- comodel_name
它的功能与One2many字段中相同 - relation
这是用于支持关联的数据表的名称,覆盖自动定义的名称 - column1
这是连接这个模型的关联表中的Many2one字段的名称 - column2
这是在关联数据表中连接comodel的Many2one字段的名称