词典合并列表

list of dictionary consolidation

我想在这里做的是 "consolidate" 具有相同 product_id 的相似行,并将其附加到另一个视图中的 one2many 字段 wizard

我必须使用此方法在我的向导字段中填写 sale_order_line

def default_get(self, cr, uid, fields, context=None):
    if context is None: context = {}
    res = super(sale_order_consolidation, self).default_get(cr, uid, fields, context=context)
    picking_ids = context.get('active_ids', [])
    active_model = context.get('active_model')

    if not picking_ids or len(picking_ids) != 1:

        return res
    assert active_model in ('sale.order'),
    picking_id, = picking_ids
    picking = self.pool.get('sale.order').browse(cr, uid, picking_id, context=context)
    items = []
    packs = []
    if not picking.order_line:
        picking.do_prepare_partial()
    for op in picking.order_line:
        item = {
        'ref': op.ref,
        'product_id': op.product_id.id,
        'name': op.name,
        'product_uom_qty': op.product_uom_qty,
        'product_uom': op.product_uom.name,
        'price_standard': op.price_standard,
        'price_unit': op.price_unit,
        'discount_2': op.discount_2,
        #'tax_id': op.tax_id.id,
        'price_subtotal': op.price_subtotal, 
        }
        #if op.product_id:
        items.append(item)

    for rec in items:
        key = d['product_id']
       # the right instruction to add QTY with the same products and append it to packs in order to update my one2many field

    res.update(order_line_consolidation=items)

    return res

而我真正想要的是:

d = [{'product_id': "x" , 'price': 1 , 'Qty': 2},
     {'product_id': "y" , 'price': 5 , 'Qty': 4},
     {'product_id': "x" , 'price': 1 , 'Qty': 1},
     {'product_id': "z" , 'price': 9 , 'Qty': 1},
     {'product_id': "y" , 'price': 5 , 'Qty': 5}
    ]

结果:

d = [{'product_id': "x" , 'price': 1 , 'Qty': 3},
     {'product_id': "y" , 'price': 5 , 'Qty': 9},
     {'product_id': "z" , 'price': 9 , 'Qty': 1},
    ]

我真正寻找的是添加具有相同产品的数量并将其附加到包装中以更新我的 one2many 字段的正确方法

感谢您的帮助,此致。

而不是使用列表使用字典并将 product_id 作为键:

    items = {}
    for op in picking.order_line:
            item = items.get(op.product_id.id, False)
            if item:
                # if we have an item with the same product_id
                # just add the quantity
                item['product_uom_qty'] += op.product.product_uom_qty
            else:
                # create new dictionary and add it to glocal dictionary
                item = {
                    'ref': op.ref,
                    'product_id': op.product_id.id,
                    'name': op.name,
                    'product_uom_qty': op.product_uom_qty,
                    'product_uom': op.product_uom.name,
                    'price_standard': op.price_standard,
                    'price_unit': op.price_unit,
                    'discount_2': op.discount_2,
                    #'tax_id': op.tax_id.id,
                    'price_subtotal': op.price_subtotal, 
                }
                #add in product.id key
                items[op.product_id.id] = item

    # in the end convert the dict to list
    list_item = []
    for dummy, item in items.iteritems():
        list_item.append(item)