我想添加一个字段,该字段将计算产品中厂商行的平均成本价。在模板中,我得到了第一行的价格,但是,如果添加新的供应商,则会出现行错误
我在产品中添加了一个计算字段。从供应商处获取价格的模板表格。
@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>)
答案 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_price
或compute_av_price
。
答案 1 :(得分:1)
您正尝试使用以点号结尾的record set
来获取字段值,
ValueError:预期的单例
如果您遵循有关Basic fields和Computed 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)