You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Odoo中如何正确重写继承的方法?

Odoo中如何正确重写继承的方法?

嘿,我来帮你捋捋你代码里的问题,以及怎么正确实现方法重写~

首先,你当前的写法存在几个关键问题,导致CustomBaseTest的get_score方法没生效:

  1. CustomBaseTest的定义错误:你把_name写成了列表['custom.base.test'],这不符合Odoo的规则,模型的_name必须是字符串。而且这个自定义抽象模型没有继承原有的base.test,相当于你新建了一个和原模型毫无关系的抽象模型,自然不会覆盖原方法。
  2. 语法小疏漏:你的方法定义里少了冒号(比如def get_score(self)后面应该加:),还有原方法里直接写return score是错的,必须用self.score来访问实例的字段。
  3. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.14 12:27:57