list of dictionary consolidation

倾然丶 夕夏残阳落幕 提交于 2019-12-24 12:27:40

问题


what i'm trying to do here is "consolidate" similar lines with the same product_id,and append it to get one2many field in another view wizard

I got to fill a sale_order_line in my wizard field uing this method;

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

and what I actually want is :

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}
    ]

result:

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

what I actually looking for is the right way to add QTY with the same products and append it to packs in order to update my one2many field

thanks you for your help, Best regards.


回答1:


instead of using list use dictionary and make the product_id as key:

    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)


来源:https://stackoverflow.com/questions/47517038/list-of-dictionary-consolidation

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!