在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_1record.field_2record.write({‘field_1’: 4})如果子模型里的字段重复,只能看到_inherits第一个子模型的字段