Odoo 13中如何对模型某字段所有记录的数值进行求和?
Odoo 跨记录字段求和正确实现方案
原代码错误原因
- 依赖规则配置错误:
@api.depends('num')仅监听当前记录的num字段变化,其他记录新增、修改、删除num时不会触发当前记录的sum_num重计算,最终数值会和预期不符。 - 计算逻辑错误:代码中调用的
rec.sum不存在对应字段,且没有读取全表num字段做汇总,累加逻辑不成立。
正确实现代码
字段定义
num = fields.Float('Number') sum_num = fields.Float(compute='_compute_sum_num', string='Sum all values of the num field')
计算方法(通用场景)
@api.depends('num') def _compute_sum_num(self): # 读取模型所有记录的num字段值求和 all_num_sum = sum(self.search([]).mapped('num')) # 所有记录的sum_num统一赋值为全表汇总值 for rec in self: rec.sum_num = all_num_sum
计算方法(大数据量优化场景)
如果模型数据量较大,使用read_group做聚合查询性能更高:
@api.depends('num') def _compute_sum_num(self): agg_res = self.read_group([], ['num:sum'], []) all_num_sum = agg_res[0]['num_sum'] if agg_res else 0.0 for rec in self: rec.sum_num = all_num_sum
补充说明
如果希望sum_num在列表视图也能稳定显示、减少重复计算,可以给字段增加store=True参数。但开启存储后需要配合重写create、write、unlink方法,在其他记录的num发生变化时主动触发sum_num的重计算,保证数值准确性。
内容的提问来源于stack exchange,提问作者Leon Nguyen
相关产品推荐
相关产品推荐

