代码之家  ›  专栏  ›  技术社区  ›  imad

字典合并列表

  •  1
  • imad  · 技术社区  · 7 年前

    我在这里要做的是用相同的 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字段

    谢谢你的帮助,致以最诚挚的问候。

    1 回复  |  直到 7 年前
        1
  •  2
  •   Charif DZ    7 年前

    不要使用list,而是使用dictionary并将product\u 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)