在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第一個子模型的字段