事实上,我有两个问题:
第一个问题:下面的代码段之间有什么区别吗?
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字段就足够了。
发布于 2022-03-26 11:59:21
对于第一个问题:这是继承委托的捷径。您可以在_inherits字段定义中使用delegate=True属性,而不是创建一个Many2one字典。这将与_inherits选项完全相同。主要的优点是这更简单。
对于第二个问题:第一个代码创建了一个基于现有模型(test.pallet)的新模型(test.box),您可以使用它已经具备的特性。因此,当您从test.pallet模型创建一个新记录时,它将在test.box中创建一个记录,它们之间的链接是box_id。
在这种情况下,您继承了包含所有字段的test.box,并且可以在表单、树或其他视图中显示它们,而无需在模型中重新创建它们。
对于第二个代码:您正在从头开始创建一个新模型,而不需要任何继承。
一般而言:根据官方文件,Odoo提供了三种类型的继承:
类继承(扩展):用于在现有模型中添加新的字段或方法。
原型继承:用于复制现有模型的整个定义。它通过同时使用_name和_inherit类属性来执行。
委托继承:它是在现有模型的基础上创建一个新模型,以使用它已经拥有的特性。因此,它是在不重复数据结构的情况下复制模型的定义,使用_inherits模型属性(注意附加的s),或者您可以在Many2one字段定义中使用delegate=True属性,而不需要使用_inherits。
https://stackoverflow.com/questions/71599656
复制相似问题