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

转载于:https://www.cnblogs.com/chenshuquan/p/10523626.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值