在 Odoo 中,关联字段是用于连接不同模型(数据库表)之间的关系的字段。主要有三种类型的关联字段:Many2one
、One2many
和 Many2many
。此外,related
参数是用于直接访问关联记录中的字段而不需要额外的数据库查询。下面我们将逐一介绍这些关联字段的使用方法,包括 Python 和 XML 代码示例,并解释 XML 中关于关联字段的 widget 使用方法。
Many2one
Many2one
字段用于表示一个模型与另一个模型之间的多对一关系。例如,一个订单行(order line)属于一个订单(order)。
Python 代码示例:
from odoo import models, fields
class Order(models.Model):
_name = 'order'
_description = 'Order'
name = fields.Char(string='Order Reference')
class OrderLine(models.Model):
_name = 'order.line'
_description = 'Order Line'
name = fields.Char(string='Line Description')
order_id = fields.Many2one('order', string='Order')
<field name="order_id" />
One2many
One2many
字段用于表示一个模型与另一个模型之间的一对多关系。它实际上是Many2one
字段的反向关系。
from odoo import models, fields
class Order(models.Model):
_name = 'order'
_description = 'Order'
name = fields.Char(string='Order Reference')
order_line_ids = fields.One2many('order.line', 'order_id', string='Order Lines')
<field name="order_line_ids" widget="one2many_list" />
Many2many
Many2many
字段用于表示两个模型之间的多对多关系。例如,一个产品可以出现在多个订单中,而一个订单也可以包含多个产品。
from odoo import models, fields
class Order(models.Model):
_name = 'order'
_description = 'Order'
name = fields.Char(string='Order Reference')
product_ids = fields.Many2many('product', string='Products')
class Product(models.Model):
_name = 'product'
_description = 'Product'
name = fields.Char(string='Product Name')
<field name="product_ids" widget="many2many_tags" />
关于 Related 参数
related
参数用于创建一个字段,其值与另一个模型中的字段相关联。这意味着当关联字段的值发生变化时,相关字段的值也会自动更新。它通常用于在视图中展示关联模型的信息,而无需进行额外的数据库查询。
from odoo import models, fields
class OrderLine(models.Model):
_name = 'order.line'
_description = 'Order Line'
name = fields.Char(string='Line Description')
order_id = fields.Many2one('order', string='Order')
order_reference = fields.Char(string='Order Reference', related='order_id.name', readonly=True)
在上述例子中,order_reference
字段会自动显示其对应订单的参考编号(name
字段)。
XML 中关联字段的 Widget 使用方法
在 Odoo 的视图定义中,可以通过指定 widget
属性来改变关联字段的显示和行为方式。例如:
widget="many2many_tags"
: 使用标签显示Many2many
字段。widget="one2many_list"
: 以列表形式显示One2many
字段。widget="many2one"
: 显示为下拉列表,允许用户从中选择一个Many2one
关联。
通过这些 widget,可以提高用户界面的交互性和可用性,使得数据的输入和查看更加直观和方便。