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_2ui

    record.write({'field_1': 4})code

  • 若是子模型裏的字段重複,只能看到_inherits第一個子模型的字段
相關文章
相關標籤/搜索