如何在自定义模块中重写helpdesk.ticket模型的create方法
Odoo 多模块继承
create方法逻辑控制方案 核心机制说明
Odoo 模型基于Python类实现多继承,方法调用严格遵循MRO(方法解析顺序)链:所有通过_inherit扩展同一模型的方法,只要执行super()调用,就会按模块加载顺序(受模块依赖关系控制)依次触发所有层级的同名方法,不存在默认的覆盖逻辑。之前第二个模块调用super后两个模块create逻辑均执行,是框架的正常表现,不是异常。
理想方案落地实现
你提到的「优先执行第二个模块判断逻辑、条件成立才触发原有自定义模块create附加逻辑」的需求完全可落地,根据是否能修改第一个自定义模块的代码,分两种实现方式,均不需要全量复制原有create代码。
方案1:可修改第一个自定义模块(推荐,无冗余、易维护)
不要把附加逻辑硬编码在create方法内,抽离可拦截的控制钩子,修改第一个模块的helpdesk.ticket代码:
# 第一个自定义模块内的helpdesk.ticket实现 @api.model def create(self, vals): res = super(HelpdeskTicket, self).create(vals) # 增加钩子判断,默认执行原有逻辑 if self._allow_run_create_extra(vals, res): res.do_something() return res def _allow_run_create_extra(self, create_vals, created_record): """create后置逻辑执行开关,供后续继承模块扩展控制""" return True
第二个模块不需要重写create方法,直接重写钩子方法加判断逻辑即可:
# 第二个模块内的helpdesk.ticket实现(_inherit继承) def _allow_run_create_extra(self, create_vals, created_record): # 写入自定义判断规则,不满足条件直接返回False阻断原有逻辑 if not 你的自定义判断条件: return False return super()._allow_run_create_extra(create_vals, created_record)
该实现符合Odoo官方开发规范,后续其他模块需要同类控制时也可直接重写该钩子,不会出现逻辑冲突。
方案2:无法修改第一个自定义模块(如为第三方维护模块)
通过显式指定super调用的类层级,跳过第一个模块的create逻辑即可,不需要复制全量代码。注意需要在第二个模块的__manifest__.py中添加对第一个自定义模块的依赖,保证模块加载顺序正确:
# 第二个模块内的代码,先导入第一个模块的HelpdeskTicket类 from odoo.addons.your_first_helpdesk_module.models.helpdesk_ticket import HelpdeskTicket as FirstModuleTicket class HelpdeskTicket(models.Model): _inherit = 'helpdesk.ticket' @api.model def create(self, vals): # 优先执行第二个模块的自定义判断逻辑 if 你的自定义条件不成立: # 直接调用第一个模块父类(即Odoo原生helpdesk.ticket)的create方法,跳过第一个模块的附加逻辑 res = super(FirstModuleTicket, self).create(vals) # 可在此处添加第二个模块自身需要的独立逻辑 return res # 条件成立时正常走MRO链,会依次执行第一个自定义模块、原生模型的create逻辑 res = super().create(vals) # 可在此处添加第二个模块自身需要的后置逻辑 return res
不推荐全量复制重写方案的原因
复制原有create代码全量重写的方式维护成本极高:后续第一个模块如果迭代更新create方法内的逻辑,复制的代码不会同步变更,极易出现版本兼容bug。
内容的提问来源于stack exchange,提问作者xixo222
相关产品推荐
相关产品推荐

