如何计算采购订单行中每列的平均价格?

时间:2019-04-15 13:13:04

标签: python python-3.x odoo

我想添加一个字段,该字段将计算产品中厂商行的平均成本价。在模板中,我得到了第一行的价格,但是,如果添加新的供应商,则会出现行错误

我在产品中添加了一个计算字段。从供应商处获取价格的模板表格。

@api.one
@api.depends('seller_ids.price')
def av_price(self):
    for rec in self:
        avg_price_list = [rec.seller_ids.price]
        avg_price_list= [float(x) for x in avg_price_list]
        try:
            rec.av_price = float(sum(avg_price_list) / len(avg_price_list))
        except ZeroDivisionError:
            if rec.av_price == float("inf") or self.av_price == float("-inf"):
                return float('nan')  # or x or return whatever makes sense
        pass
av_price = fields.Float(string="av price",  required=False, compute=av_price )

这是日志

 File "/home/autoparts/Developments/odoo11/odoo/odoo/models.py", line 4371, in ensure_one
raise ValueError("Expected singleton: %s" % self)
 ValueError: Expected singleton: product.supplierinfo(<odoo.models.NewId object at 0x7f0004af1ee8>, <odoo.models.NewId object at 0x7f0004af1c78>)

2 个答案:

答案 0 :(得分:1)

错误出在[rec.seller_ids.price]中。当您添加第二个记录时,seller_ids将是一个包含2个记录的记录集。您不能直接在此类记录集上调用属性/字段,而只能在单例(具有一个记录的记录集)上调用。

所以您的方法应该更像这样:

@api.depends('seller_ids.price')
def av_price(self):
    for rec in self:
        price_list = [s.price for s in rec.seller_ids]
        if price_list:
            rec.av_price = sum(price_list) / len(price_list)
        else:
            rec.av_price = -1  # can make sense or 0

IMO,您应该重命名avg_price中的字段,因为将平均值缩写为avg更为常见。并尝试遵循Odoo的准则并将方法重命名为compute_avg_pricecompute_av_price

答案 1 :(得分:1)

您正尝试使用以点号结尾的record set来获取字段值,

  

ValueError:预期的单例

如果您遵循有关Basic fieldsComputed fields的准则。您的方法可能如下所示:

@api.depends('seller_ids.price')
def _compute_av_price(self):
    for rec in self:
        if rec.seller_ids:
            rec.av_price = sum(seller.price for seller in rec.seller_ids) / len(rec.seller_ids)


av_price = fields.Float(string="av price", compute=_compute_av_price)
  

必填–该字段的值是否为必需(布尔值,默认为False)