Odoo中如何正确重写继承的方法?
Odoo中如何正确重写继承的方法?
嘿,我来帮你捋捋你代码里的问题,以及怎么正确实现方法重写~
首先,你当前的写法存在几个关键问题,导致CustomBaseTest的get_score方法没生效:
- CustomBaseTest的定义错误:你把
_name写成了列表['custom.base.test'],这不符合Odoo的规则,模型的_name必须是字符串。而且这个自定义抽象模型没有继承原有的base.test,相当于你新建了一个和原模型毫无关系的抽象模型,自然不会覆盖原方法。 - 语法小疏漏:你的方法定义里少了冒号(比如
def get_score(self)后面应该加:),还有原方法里直接写return score是错的,必须用self.score来访问实例的字段。 - CustomExamRecord的冗余定义:你重复定义了
student字段,其实完全没必要,因为已经继承了exam.record,这个字段已经存在了。
接下来给你看正确的写法,分两部分:
第一步:正确重写抽象模型的方法
在custom_school模块里,这样定义CustomBaseTest:
from odoo import models, fields class CustomBaseTest(models.AbstractModel): _name = 'custom.base.test' _inherit = 'base.test' # 关键:继承原有的抽象模型base.test def get_score(self): # 注意访问字段要加self return self.score * 10
第二步:扩展原有的ExamRecord模型
如果你只是想让原有的exam.record使用重写后的方法,其实不需要重新定义_name,直接继承原模型即可:
class CustomExamRecord(models.Model): _inherit = 'exam.record' # 直接扩展原有的exam.record模型 # 不需要重复定义student字段,除非你要修改它的属性(比如改变显示名、必填性等)
额外的注意事项
- 别忘了在
custom_school模块的__manifest__.py里添加对school模块的依赖,也就是在depends列表里加上'school',这样Odoo会先加载原模块,再加载你的自定义模块,保证继承顺序正确。 - 原代码里的
ExamRecord和CustomExamRecord如果只是想扩展而非替换模型,都不需要重新定义_name,只用_inherit即可;如果是要完全替换原模型才需要同时指定_name和_inherit。
这样修改后,当你安装custom_school模块,所有继承了base.test的模型(包括exam.record)都会自动使用你重写后的get_score方法啦~
备注:内容来源于stack exchange,提问作者strike_noir
相关产品推荐
相关产品推荐

