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

Odoo12树视图分组后如何显示自定义计算字段的求和值

问题原因

Odoo的树视图分组聚合默认在数据库层面完成,你当前的quantity_in、quantity_out是非存储型计算字段,值不会写入数据库表,分组查询时无法直接从数据库聚合出合计值,所以只会在未分组的普通树视图生效。

解决方案

有两种可落地的方案,可根据你的业务场景选择:

方案1:将计算字段设为存储型(推荐,性能更好)

给计算字段添加store=True属性,同时补充@api.depends装饰器声明计算依赖,让字段值自动写入数据库,就能支持原生的分组聚合。

调整后的Python代码

from odoo import models, fields, api

class StockMoveLine(models.Model):
    _inherit = 'stock.move.line'

    # 增加store=True参数
    quantity_in = fields.Float('Quantity In', compute='_get_qty_in_out', store=True)
    quantity_out = fields.Float('Quantity Out', compute='_get_qty_in_out', store=True)

    # 补充depends装饰器,里面填写你计算逻辑用到的所有关联字段
    @api.depends('qty_done', 'state', 'location_id.usage', 'location_dest_id.usage')
    def _get_qty_in_out(self):
        # 原有计算逻辑保持不变,以下为示例逻辑请替换成你自己的实现
        for line in self:
            in_qty = out_qty = 0.0
            if line.state == 'done':
                if line.location_dest_id.usage == 'internal':
                    in_qty = line.qty_done
                if line.location_id.usage == 'internal':
                    out_qty = line.qty_done
            line.quantity_in = in_qty
            line.quantity_out = out_qty

操作步骤

  • 保存代码后重启Odoo服务
  • 进入应用列表升级你对应的自定义模块,系统会自动回填所有历史记录的计算字段值到数据库
  • 原有XML代码无需改动,分组后即可正常显示合计

方案2:重载read_group方法(适合无法存储计算字段的场景)

如果你的计算逻辑依赖动态上下文、无法固化存储,可以重载模型的read_group方法,手动计算每个分组的合计值。

调整后的Python代码

from odoo import models, fields, api

class StockMoveLine(models.Model):
    _inherit = 'stock.move.line'

    # 原有计算字段不用修改,无需加store=True
    quantity_in = fields.Float('Quantity In', compute='get_qty_in')
    quantity_out = fields.Float('Quantity Out', compute='get_qty_in')

    # 原有compute方法保持不变
    def get_qty_in(self):
        # 你的原有计算逻辑
        pass

    # 重载read_group方法手动处理计算字段的聚合
    def read_group(self, domain, fields, groupby, offset=0, limit=None, orderby=False, lazy=True):
        res = super().read_group(domain, fields, groupby, offset=offset, limit=limit, orderby=orderby, lazy=lazy)
        # 仅当查询包含目标计算字段时处理
        if {'quantity_in', 'quantity_out'} & set(fields):
            for group in res:
                # 获取当前分组对应的所有记录
                group_records = self.search(group.get('__domain', domain))
                # 手动计算合计
                group['quantity_in'] = sum(group_records.mapped('quantity_in'))
                group['quantity_out'] = sum(group_records.mapped('quantity_out'))
        return res

注意事项

该方案不需要修改字段存储属性,但数据量较大时分组查询性能会有所下降,建议仅在无法使用方案1时选择。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 09:18:03