Odoo代码报错:EventBooth.check_app_installed()缺少必填参数'self'
问题分析
报错TypeError: EventBooth.check_app_installed() missing 1 required positional argument: 'self'的核心原因是类定义阶段直接调用了实例方法check_app_installed()。此时EventBooth类尚未完成初始化,不存在self对象,直接调用方法会缺少必要参数。
问题出在这行代码:
if check_app_installed(): _inherit = 'event.booth' price = fields.Float(string='Price')
修改方案
方案1:模块依赖实现(推荐)
Odoo标准开发流程中,依赖模块应通过__manifest__.py声明,而非动态判断。修改模块配置文件,添加对event模块的依赖:
{ # 其他配置项... 'depends': ['base', 'event'], }
然后简化模型代码,直接继承event.booth并添加字段:
from odoo import models, fields, api class EventBooth(models.Model): _inherit = 'event.booth' price = fields.Float(string='Price') @api.model def create(self, vals): # 依赖已确保event模块已安装,无需再检查 return super(EventBooth, self).create(vals)
方案2:修复动态判断逻辑(不推荐,仅作演示)
若必须保留动态安装逻辑,需将类级别的条件判断调整到模型初始化阶段,同时修正方法调用方式:
from odoo import models, fields, api class EventBooth(models.Model): _name = 'event.booth' @api.model def check_app_installed(self): event_app = self.env['ir.module.module'].search([('name', '=', 'event'), ('state', '=', 'installed')]) return bool(event_app) @api.model def create(self, vals): app_installed = self.check_app_installed() if not app_installed: event_app = self.env['ir.module.module'].search([('name', '=', 'event')]) event_app.button_immediate_install() # 安装后刷新环境,确保能识别event.booth模型 self.env.clear() # 动态调整模型继承关系(不符合Odoo规范,仅作演示) if self.check_app_installed(): self._inherit = 'event.booth' self.price = fields.Float(string='Price') return super(EventBooth, self).create(vals)
注意:这种动态修改模型属性的方式违反Odoo开发规范,可能引发缓存、模型识别等问题,生产环境不建议使用。
关键提示
- Odoo模型的核心属性(如
_name、_inherit)在类定义阶段就会被解析,无法通过类内条件判断动态修改。 - 模块依赖是处理Odoo模块间依赖关系的标准方式,能避免动态判断带来的各类异常。
内容的提问来源于stack exchange,提问作者Perino
相关产品推荐
相关产品推荐

