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

Odoo12升级到Odoo14后muk_dms模块出现Compute method failed报错如何解决

Odoo muk_dms 12升14 actions字段报错修复方案

报错核心原因

Odoo 14 对计算字段(compute field)的赋值校验规则比Odoo 12严格很多,该报错直接指向muk_dms.file模型中actions计算字段的compute方法,未按Odoo 14要求返回匹配的字段类型值,或存在部分记录未赋值的情况。

排查步骤

  • 首先定位actions字段的定义,确认字段关联的模型和类型:
    打开muk_dms.file模型代码,找到actions字段声明,确认字段类型(通常为One2many/Many2many关联muk_dms.action模型,或为Json类型存储动作配置)
  • 找到actions字段绑定的compute方法,通常命名为_compute_actions,检查是否存在以下问题:
    • 未遍历所有传入的记录集,只处理了单条记录
    • 给字段赋值了列表、ID数组、字典等不符合字段要求的类型(Odoo12允许赋值ID列表给关系字段,Odoo14必须赋值对应模型的记录集)
    • 分支逻辑中存在部分记录没有被赋值的场景
    • 赋值的记录集所属模型和字段声明的关联模型不匹配

可直接复用的修复代码示例

错误代码(Odoo12版本逻辑)

class MukDmsFile(models.Model):
    _name = 'muk_dms.file'
    
    actions = fields.One2many(
        comodel_name='muk_dms.action',
        compute='_compute_actions',
        string='可用动作'
    )
    
    def _compute_actions(self):
        for record in self:
            action_ids = []
            # 业务逻辑生成动作ID列表
            if record.permission_write:
                action_ids.append(self.env.ref('muk_dms.action_edit_file').id)
            if record.permission_delete:
                action_ids.append(self.env.ref('muk_dms.action_delete_file').id)
            # 旧版本直接赋值ID列表
            record.actions = action_ids

修复后代码(适配Odoo14)

class MukDmsFile(models.Model):
    _name = 'muk_dms.file'
    
    actions = fields.One2many(
        comodel_name='muk_dms.action',
        compute='_compute_actions',
        string='可用动作'
    )
    
    def _compute_actions(self):
        for record in self:
            # 初始化对应模型的空记录集
            actions = self.env['muk_dms.action']
            # 业务逻辑拼接记录集
            if record.permission_write:
                actions += self.env.ref('muk_dms.action_edit_file').sudo()
            if record.permission_delete:
                actions += self.env.ref('muk_dms.action_delete_file').sudo()
            # 赋值符合要求的记录集
            record.actions = actions

额外检查点

  • 如果actions是Json/Char类型,不要赋值None,空值统一赋值为{}/""
  • 检查compute方法的@api.depends装饰器依赖字段是否存在、拼写正确,Odoo14会对无效依赖触发隐式赋值错误
  • 如果字段设置了inverse/search方法,同步检查两个方法的返回值类型是否符合要求

内容的提问来源于stack exchange,提问作者deen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 12:36:02