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

