You need to enable JavaScript to run this app. Odoo 13中如何对模型某字段所有记录的数值进行求和?
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.13 18:48:02