实际上,我有两个问题:
第一个问题:以下代码片段之间有什么区别吗?
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
字段就足够了。
对于第一个问题:这是继承委派的快捷方式。您可以在Many2one字段定义中使用delegate=True属性,而不是创建_inherits字典。这将与_inherits选项完全相同。主要优点是这更简单。
第二个问题:在第一个代码中,它在现有模型(test.box(的基础上创建了一个新模型(test.tablet(,您可以使用它已经拥有的功能。因此,当你从test.pallet模型创建一个新记录时,它会在test.box中创建一个记录,它们之间的链接是box_id。
在这种情况下,您继承了test.box和所有字段,您可以在表单、树或其他视图中显示它们,而无需在模型中重新创建它们。
第二段代码:您正在从头开始创建一个新模型,而没有任何继承。
概述:根据官方文件,Odoo提供了三种类型的继承:
•类继承(扩展(:用于向现有模型添加新字段或方法。
•原型继承:用于复制现有模型的整个定义。它是通过使用_name和inherit类属性来执行的同时
•委托继承:它是在现有模型的基础上创建一个新模型,以使用它已经拥有的功能。所以它是复制模型的定义复制数据结构使用_inherits模型属性(注意额外的s(,或者可以在Many2one字段定义中使用delegate=True属性,而无需使用_inherit。