目录
1. Many2one
Many2one字段又称为多对一字段,原理就和sql的外键一样,指向另一个模型。在odoo的前端视图中常常以下拉列表的形式出现,通常以前缀_id 的形式定义,就以书籍借阅为例子,一个书籍信息模型book,一个借阅记录模型record,在书籍借阅模型record中定义书籍:定义方式如下:
book_id = fields.Many2one('book',string='Book')
其中的book指的是所关联的书籍信息模型,在数据库中的存储形式就是所关联模型的id,当获得了一条借阅记录的话,通过odoo中的orm映射,以self.book_id 的形式得到它所关联的一条书籍信息记录,该字段的常用参数
(1)ondelete,可选参数为set null, restrict, cascade 例如:
book_id = fields.Many2one('book',string='Book',ondelete='set null')
- set null: 当书籍信息删除时,所关联的借阅记录中的book_id 设置为空值
- cascade: 当书籍信息删除时,所关联的借阅记录也删除
- restrict: 当书籍信息删除时,如果该书籍存在借阅记录,则无法删除该书籍信息
(2)domain(传入一个域表达式)
比如我们想创建借阅记录时,只能选择作者为张三的书籍,可以如下设置:
book_id = fields.Many2one('book',string='Book',domain=[('author','=','张三')])
!注意:domain中的条件过滤针对的是所关联的模型,在上述案例中指的是book,而不是所定义字段的模型。
拓展知识:前端xml中的视图使用Many2one字段时如果想对Many2one字段不可编辑和创建,可以在field标签中添加属性:
options="{'no_create_edit':True,'no_create':True}"
2.One2many
简单来说One2many(一对多)就是Many2one(多对一)反过来而已,是一种虚拟的联系,是建立在Many2one的基础上的,不能单独使用。还是以书籍借阅为例子,之前我们通过book_id可以获得一条借阅记录的书籍记录,但是一本书籍可能有着多条借阅记录,这时我们就可以在书籍信息模型里定义这样一个字段,定义方式如下:
records = fields.One2many('record','book_id',string='借阅记录')
其中record指的是借阅记录的模型,book_id 指的是在另一个模型中定义的多对一字段。通过orm映射的方式,如果获得了一条书籍信息,那么可以通过.records的方式获得多条借阅的记录集,然后可以对这个记录集进行遍历。
在前端One2many字段的使用方法:
<field name="records" widget="one2many">
<tree>
<field name="name" string="Name"/>
<field name="create_date" string="Create Date"/>
</tree>
</field>
3.Many2many
又称之为多对多字段,是一种双向的关系,这种关系一般是通过中间表的方式来维持。这种关系经常使用的场景是用于一些标签,比如说一篇文章可能有多个类别,一个类别下面又可以有许多文章,这时便需要定义一种多对多关系。这种字段的定义一般是通过_ids尾缀的形式,一般的定义方式如下所示:
article_ids = fields.Many2many('article', String='Atricles')
相反在文章模型中也可以定义category_ids 指向类别模型,后端通过.字段名的方法也可以得到相应的记录集。
拓展:前端使用多对多字段以标签的形式显示,使用方法如下:

<field name="book_ids" widget="many2many_tags"/>

2761

被折叠的 条评论
为什么被折叠?



