Odoo中能否继承已继承helpdesk.team的类?实现方法咨询
当然可以实现,不过得先搞清楚你那个未设置_name的类在Odoo里的角色——它本质是直接动态扩展了helpdesk.team原模型,并没有生成新的独立模型,它的所有方法和逻辑已经合并到helpdesk.team里面了。
所以新增功能的最优路径根本不需要同时继承现有类和父类,直接基于helpdesk.team再做一层扩展就行,具体分两种场景说明:
场景1:现有类是直接扩展helpdesk.team(无_name,无_abstract)
这就是你当前的情况,实现步骤非常简单:
- 在你的模块里新建一个Python类,只需要指定
_inherit=['helpdesk.team'],就能基于已经被扩展过的helpdesk.team模型添加新功能:
from odoo import models, api class HelpdeskTeamNewExtension(models.Model): _inherit = ['helpdesk.team'] # 新增自定义方法 def new_custom_action(self): # 直接调用现有类里的方法,因为它已经在helpdesk.team里了 self.some_existing_method() # 这里写你的新功能逻辑 pass # 如果需要重写现有方法,用super()保留原有逻辑 @api.model def create(self, vals): # 新增前置处理逻辑 record = super().create(vals) # 新增后置处理逻辑 return record
- 在模块的
__manifest__.py里把这个类所在的py文件加进去,升级模块后新功能就会生效,完全不用碰原来的扩展类。
场景2:现有类是抽象基类(设置了_abstract=True)
如果你的现有类是用来封装通用逻辑的抽象类(这种情况你得给它加_abstract=True),那可以通过多重继承同时继承这个抽象类和helpdesk.team:
假设现有抽象类是这样的:
from odoo import models class HelpdeskTeamAbstractBase(models.AbstractModel): _abstract = True _name = False # 或者不设置_name def some_shared_method(self): # 通用逻辑代码 pass
新类的写法:
from odoo import models class HelpdeskTeamNewExtension(models.Model): _inherit = ['helpdesk.team', 'helpdesk.team.abstract.base'] # 注:抽象类如果没设置_name,Odoo会用类名的小写蛇形作为技术名称,比如这里的helpdesk.team.abstract.base对应类名HelpdeskTeamAbstractBase def new_custom_method(self): self.some_shared_method() # 你的新逻辑 pass
不过这种场景和你描述的情况不符,因为你说现有类是通过_inherit=['helpdesk.team']继承的,所以肯定是场景1的情况。
关键提醒
- 只设
_inherit不设_name的类,是直接修改原模型的结构,所有后续继承原模型的类都会自动带上之前的扩展逻辑。 - 多重继承时,方法执行顺序遵循MRO规则,Odoo会按
_inherit列表的顺序依次调用父类方法。 - 别重复继承同一个模型,容易引发逻辑冲突。
内容的提问来源于stack exchange,提问作者ASD
相关产品推荐
相关产品推荐

