其实我有两个问题:
第一个:下面的代码片段有什么区别吗?
class Pallet(models.Model):
_name = 'test.pallet'
_inherits = {'test.box': 'box_id'}
_description = 'Test Pallet'
box_id = fields.Many2one('test.box', 'Box', required=True,
ondelete='cascade')
field_in_pallet = fields.Char('Field2')
class Pallet(models.Model):
_name = 'test.pallet'
_description = 'Test Pallet'
box_id = fields.Many2one('test.box', 'Box', required=True,
ondelete='cascade',delegate=True)
field_in_pallet = fields.Char('Field2')
第二个:如果我在代码中使用 _inherits,我看不出代码中没有它有什么区别。 例如:
class Pallet(models.Model):
_name = 'test.pallet'
_inherits = {'test.box': 'box_id'}
_description = 'Test Pallet'
box_id = fields.Many2one('test.box', 'Box', required=True,
ondelete='cascade')
field_in_pallet = fields.Char('Field2')
class Pallet(models.Model):
_name = 'test.pallet'
_description = 'Test Pallet'
box_id = fields.Many2one('test.box', 'Box', required=True,
ondelete='cascade')
field_in_pallet = fields.Char('Field2')
示例 Many2one
字段就足够了。
最佳答案
对于第一个问题: 这是继承委托(delegate)的捷径。您可以在 Many2one 字段定义中使用 delegate=True 属性,而不是创建 _inherits 字典。这将与 _inherits 选项完全相同。主要优点是这更简单。
对于第二个问题: 第一个代码,它基于现有模型 (test.box) 创建一个新模型 (test.pallet),您可以使用它已有的功能。因此,当您从 test.pallet 模型创建新记录时,它将在 test.box 中创建一条记录,它们之间的链接是 box_id。
在这种情况下,您继承了包含所有字段的 test.box,并且可以在表单、树或其他 View 中显示它们,而无需在模型中重新创建它们。
对于第二个代码:您正在从头开始创建一个新模型,而不进行任何继承。
一般来说: 根据官方文档,Odoo 提供了三种类型的继承:
• 类继承(扩展):用于向现有模型添加新字段或方法。
• 原型(prototype)继承:用于复制现有模型的整个定义。它是通过使用 _name 和 _inherit 类属性来执行的 同时。
• 委托(delegate)继承:是在现有模型的基础上创建一个新模型,以使用其已有的功能。所以它是复制模型的定义而无需 复制数据结构使用 _inherits 模型属性(请注意附加的 s),或者您可以在 Many2one 字段定义中使用 delegate=True 属性,而无需使用 _inherits。
关于odoo - Many2one 字段上的 delegate 和 odoo15 中的 _inherits 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71599656/