many2one
在实践中,many2one 可以看作是表单视图中的下拉列表。
一个属性可以有一种类型,但可以将相同的类型分配给多个属性。many2one概念支持这一点。
many2one 是指向另一个对象的简单链接。例如,为了 res.partner
在我们的测试模型中定义一个链接,我们可以写:
partner_id = fields.Many2one("res.partner", string="Partner")
按照惯例,many2one 字段具有 _id
后缀。然后,可以通过以下方法轻松访问合作伙伴中的数据:
print(my_test_object.partner_id.name)
参考
foreign keys 外键
many2many
一个属性可以有多个标记,一个标记可以分配给许多属性。many2many 概念支持这一点。
many2many 是双向多重关系:一侧的任何记录都可以与另一侧的任意数量的记录相关联。例如,为了在测试模型上定义指向模型的 account.tax
链接,我们可以编写:
tax_ids = fields.Many2many("account.tax", string="Taxes")
按照惯例,many2many 字段具有 _ids
后缀。这意味着可以将几种税种添加到我们的测试模型中。它的行为为记录列表,这意味着访问数据必须在循环中完成:
for tax in my_test_object.tax_ids:print(tax.name)
记录列表称为记录集,即有序的记录集合。它支持对集合的标准 Python 操作,例如 len()
和 iter()
,以及额外的集合操作,例如 recs1 | recs2
。
one2many
many2one的概念可指同一属性可以有多个选项。 当有给定属性的报价列表,我们将使用 one2many 概念。
one2many 与 many2one 正好相反。例如,我们在测试模型上定义了一个指向 res.partner
模型的链接,这要归功于字段 partner_id
。我们可以定义反比关系,即链接到我们的合作伙伴的测试模型列表:
test_ids = fields.One2many("test_model", "partner_id", string="Tests")
第一个参数称为 comodel
协同模型第二个参数是我们要反转的字段。
通常,one2many 字段具有 _ids
后缀。它们表现为记录列表,这意味着访问数据必须在循环中完成:
for test in partner.test_ids:print(test.name)
危险
由于 One2many
是虚拟关系,因此必须在comodel协同模型中定义一个 Many2one
字段。
注意
首先,我们不需要所有模型的操作或菜单。某些模型只能通过另一个模型访问。在我们的练习中就是这种情况:报价总是通过属性访问。
其次,尽管该 property_id
字段是必填字段,但我们没有将其包含在视图中。Odoo如何知道我们的报价与哪个属性相关联?这就是使用Odoo框架的魔力之一:有时事物是隐式定义的。当我们通过 one2many 字段创建记录时,为了方便起见,会自动填充相应的 many2one。