乐趣区

odoo 模型继承

在 odoo 中有两种模型的继承机制(传统方式和委托继承方式)
重点:在__manifest__.py 中找到 depends, 加上要继承的模块
‘depends’: [‘account’]

注意继承的模型所在 addon 需要在本 addon 里添加依赖,不然会报一个 TypeError: Model ‘xxx’ does not exist in registry 错误。
传统方式
能够添加字段 改写字段定义 添加约束 添加或改写方法共有两种写法 1 类继承 2 原型继承
类继承
_name = ‘event.registration’
_inherit = ‘event.registration’

_name 和_inherit 的模型名一致,都为 ’event.registration’, 此时_name 可以省略不写。
类继承不会创建新的模型,能够直接修改模型定义,新加的字段会在原表中添加,数据库中没有新的表生成。

例子
class model_1(models.Model):
_name = ‘activity.registration’

class model_2(models.Model):
_inherit = ‘event.registration’

event_id = fields.Many2one(
‘activity.event’, string=’Event’, required=True,
readonly=True, states={‘draft’: [(‘readonly’, False)]})

原型继承
_name = ‘activity.registration’
_inherit = ‘event.registration’

_name 和 _inherit 的模型名不同。相当于把模型 event 的属性(字段 方法等)copy 了一份,重新创建一个新的模型 activity,新的表里有模型 event 的字段。
例子
class ActivityRegistration(models.Model):
_name = ‘event.registration’
name = fields.Char()
def say(self):
return self.check(“event”)
def check(self, s):
return “This is {} record {}”.format(s, self.name)

class ActivityRegistration(models.Model):
_name = ‘activity.registration’
_inherit = ‘event.registration’
def say(self):
return self.check(“activity”)

支持多重继承,用列表表示 _inherit = [‘mail’, ‘resource’]
委托继承
class NewModel():
_name = “new.model”
_inherits = {‘ 模型 1 ’: ‘ 关联字段 1 ′,’ 模型 2 ’: ‘ 关联字段 2 ’}

支持多重继承,并提供透明的子模型字段访问方法,好像模型有子模型字段
例子
class Child0(models.Model):
_name = ‘delegation.child0’
field_0 = fields.Integer()
class Child1(models.Model):
_name = ‘delegation.child1’
field_1 = fields.Integer()
class Delegating(models.Model):
_name = ‘delegation.parent’
_inherits = {
‘delegation.child0’: ‘child0_id’,
‘delegation.child1’: ‘child1_id’,
}
child0_id = fields.Many2one(‘delegation.child0′, required=True, ondelete=’cascade’)
child1_id = fields.Many2one(‘delegation.child1′, required=True, ondelete=’cascade’)

这种继承只能继承字段,其他方法不继承可以读写子模型的字段 record.field_1
record.field_2
record.write({‘field_1’: 4})

如果子模型里的字段重复, 只能看到_inherits 第一个子模型的字段

退出移动版