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

Python Odoo中合并相同产品行并汇总数量咨询

合并相同sh_product_id的采购协议行条目

实现思路

通过字典分组的方式,以sh_product_id为键聚合相同产品的行条目,汇总sh_qty和sh_ordered_qty,同时保留其他字段的取值(取同产品第一条记录的对应字段值,确保与原数据一致)。

代码实现

from collections import defaultdict
import datetime

# 原始vals变量
vals = {
    'partner_ids': [80],
    'sh_source': 'PR/G/22/08/26/019,PR/G/22/08/26/018',  
    'purchase_request_id': 27,
    'sh_purchase_agreement_line_ids': [
       (0, 0, {'sh_product_id': 34, 'sh_product_description': 'Ban Motor', 'sh_qty': 4.0, 'request_line_id': 32, 'sh_ordered_qty': 4.0, 'sh_product_uom_id': 1, 'dest_warehouse_id': 1, 'analytic_tag_ids': [1, 2], 'schedule_date': datetime.date(2022, 8, 26)}),
       (0, 0, {'sh_product_id': 34, 'sh_product_description': 'Ban Motor', 'sh_qty': 2.0, 'request_line_id': 31, 'sh_ordered_qty': 2.0, 'sh_product_uom_id': 1, 'dest_warehouse_id': 1, 'analytic_tag_ids': [1, 2], 'schedule_date': datetime.date(2022, 8, 26)})
]}

# 初始化分组字典,键为sh_product_id,值存储汇总数据和基础字段
product_groups = defaultdict(lambda: {
    'total_qty': 0.0,
    'total_ordered_qty': 0.0,
    'base_fields': None
})

# 遍历所有行条目进行分组汇总
for line in vals['sh_purchase_agreement_line_ids']:
    line_data = line[2]
    product_id = line_data['sh_product_id']
    
    # 累加数量字段
    product_groups[product_id]['total_qty'] += line_data['sh_qty']
    product_groups[product_id]['total_ordered_qty'] += line_data['sh_ordered_qty']
    
    # 保存同产品第一条记录的基础字段(排除需要汇总的字段)
    if product_groups[product_id]['base_fields'] is None:
        base_fields = line_data.copy()
        del base_fields['sh_qty']
        del base_fields['sh_ordered_qty']
        product_groups[product_id]['base_fields'] = base_fields

# 构造合并后的行列表
merged_lines = []
for product_id, group_data in product_groups.items():
    merged_data = group_data['base_fields'].copy()
    merged_data['sh_qty'] = group_data['total_qty']
    merged_data['sh_ordered_qty'] = group_data['total_ordered_qty']
    # 保持原有的(0, 0, {})格式
    merged_lines.append((0, 0, merged_data))

# 更新vals中的行数据
vals['sh_purchase_agreement_line_ids'] = merged_lines

# 验证结果
print(vals['sh_purchase_agreement_line_ids'])

关键说明

  • 用collections.defaultdict简化分组逻辑,自动为新的sh_product_id初始化汇总结构。
  • 非汇总字段直接复用同产品第一条记录的取值,保证与原数据一致。
  • 最终输出保持Odoo标准的记录格式(0, 0, 字典数据),适配系统要求。

内容的提问来源于stack exchange,提问作者Muhammad Saleem

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 12:05:17