當(dāng)前位置:
首頁(yè) >
odoo 模型继承
發(fā)布時(shí)間:2025/5/22
32
豆豆
在odoo中有兩種模型的繼承機(jī)制(傳統(tǒng)方式和委托繼承方式)
重點(diǎn):在__manifest__.py中找到depends,加上要繼承的模塊
'depends': ['account']- 注意繼承的模型所在addon需要在本addon里添加依賴(lài),不然會(huì)報(bào)一個(gè)TypeError: Model 'xxx' does not exist in registry 錯(cuò)誤。
傳統(tǒng)方式
- 能夠添加字段 改寫(xiě)字段定義 添加約束 添加或改寫(xiě)方法共有兩種寫(xiě)法 1 類(lèi)繼承 2 原型繼承
類(lèi)繼承
_name = 'event.registration' _inherit = 'event.registration'_name和_inherit的模型名一致,都為'event.registration', 此時(shí)_name可以省略不寫(xiě)。
類(lèi)繼承不會(huì)創(chuàng)建新的模型,能夠直接修改模型定義,新加的字段會(huì)在原表中添加,數(shù)據(jù)庫(kù)中沒(méi)有新的表生成。
例子
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 的模型名不同。 相當(dāng)于把模型 event 的屬性(字段 方法等)copy了一份,重新創(chuàng)建一個(gè)新的模型 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': '關(guān)聯(lián)字段1','模型2': '關(guān)聯(lián)字段2'}- 支持多重繼承,并提供透明的子模型字段訪(fǎng)問(wèn)方法,好像模型有子模型字段
例子
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')這種繼承只能繼承字段,其他方法不繼承可以讀寫(xiě)子模型的字段
record.field_1record.field_2record.write({'field_1': 4})如果子模型里的字段重復(fù),只能看到_inherits第一個(gè)子模型的字段
轉(zhuǎn)載于:https://www.cnblogs.com/chenshuquan/p/10523626.html
總結(jié)
- 上一篇: 历届试题 买不到的数目
- 下一篇: 点按钮ajax get方法修改0或1状态