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

