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
相关产品推荐
相关产品推荐

