日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

odoo 模型继承

發布時間:2025/5/22 编程问答 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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_1record.field_2record.write({'field_1': 4})
  • 如果子模型里的字段重復,只能看到_inherits第一個子模型的字段

轉載于:https://www.cnblogs.com/chenshuquan/p/10523626.html

總結

以上是生活随笔為你收集整理的odoo 模型继承的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。