Odoo 中的关系字段

Python3.8

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

目录

1. Many2one

2.One2many

3.Many2many

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"/>

您可能感兴趣的与本文相关的镜像

Python3.8

Python3.8

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值