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

按类别ID和计数数量筛选行

  •  1
  • Chaban33  · 技术社区  · 6 年前

    我的目标是循环使用相同类别ID的所有行,并计算它们拥有的总数量和 if qty_categ_total < categ_id.qty_for_discount (我将此字段添加到“product.category”中,而不需要在文本字段中发布消息。我的代码不能按我想要的方式工作。

    例子。

    如果我有两条相同的线 categ_id 2号和5号以及我的 categ_id.qty_for_discount 是10。消息应该是我需要添加3个相同的产品 类别ID 获得折扣

    更新

    如果有不同类别的产品,我应该为每个类别都收到一条消息

    class PurchaseOrder(models.Model):
        _inherit = 'purchase.order'
    
        discount_warning_message = fields.Text(string='Discount Warning', compute='discount_warning')
    
         @api.depends('order_line.product_id', 'order_line.product_qty')
    def discount_warning(self):
        qty_categ_total = 0.0
        for line in self.order_line:
            qty_categ_total +=  line.product_qty
            if qty_categ_total < line.product_id.categ_id.qty_for_discount:
                message = (_("You can get discount if you add %s more %s\n")) % (qty_categ_total, line.product_id.categ_id.name)
                self.discount_warning_message = message
    
    1 回复  |  直到 6 年前
        1
  •  2
  •   CZoellner    6 年前

    您的代码似乎是正确的,但我会更改一些内容。第一次使用 @api.one 让odoo自动循环所有订单,或为每个循环添加一个以上订单,以及 @api.multi . 第二,不止一个类别呢?

    @api.multi
    @api.depends('order_line.product_id', 'order_line.product_qty')
    def discount_warning(self):
        msg = _("You can get discount if you add %s more %s\n")
        for order in self:
            categ_qtys = {}
            for line in order.order_line:
                if line.product_id.categ_id not in categ_qtys:
                    categ_qtys[line.product_id.categ_id] = 0.0
                categ_qtys[line.product_id.categ_id] += line.product_qty
            msgs = []
            for categ, qty in categ_qtys.iteritems():
                if qty < categ.qty_for_discount:
                    msgs.append(msg % (qty, categ.name))
            if msgs:
                order.discount_warning_message = "".join(msgs)
    

    一般建议:总是尝试调试您的方法。他们都打过电话了吗?如果不是,方法就不是问题。