Odoo 13 切换到树视图时报Expected singleton错误如何解决?
Odoo 13 请假模块切换视图触发Expected singleton错误排查方案
核心原因说明
该错误本质是对包含多条记录的记录集执行了仅支持单条记录的操作,从日历视图切换到树视图时触发,是因为树视图会批量加载多条记录,触发了未做批量适配的compute字段逻辑。
分步排查方案
- 检查所有compute字段的计算方法,是否未遍历self直接操作
Odoo调用compute方法时会传入当前加载的所有记录的记录集,默认直接操作self仅适配单条记录场景,批量加载时必然报错
# 错误示例 def _compute_leave_duration(self): self.duration = self.end_date - self.start_date # 正确示例 def _compute_leave_duration(self): for record in self: record.duration = record.end_date - record.start_date - 检查已遍历self的compute方法内部是否存在隐式多记录操作
若已做遍历仍报错,检查遍历内部代码是否有以下问题:- 调用search方法返回多条记录后直接取字段值,比如
self.env['hr.leave.type'].search([('is_paid','=',True)]).leave_days,search返回多条记录时直接取字段会报错 - 对多值关联字段(One2many、Many2many)直接取字段值,比如
record.approver_ids.name,如果该条请假有多条审批人记录,直接取name会触发错误
- 调用search方法返回多条记录后直接取字段值,比如
- 结合报错堆栈定位具体代码行
堆栈信息中会明确标注报错的字段、方法和对应代码行号,可在对应位置临时加日志打印self.ids确认是否为多记录场景 - 对比日历视图与树视图的字段差异
若树视图新增了日历视图未展示的compute字段,可优先排查该字段的计算逻辑
内容的提问来源于stack exchange,提问作者for-loop
相关产品推荐
相关产品推荐

