如何计算 odoo 13 销售订单行上的字段?

how to compute field on odoo 13 sale order line?

我正在尝试计算销售订单行上的折扣字段,该方法在 odoo 12 中运行良好,但在 odoo 13 中我每次尝试添加行时都会遇到此错误

sale.order.line(<NewId 0x7f3dd0d624a8>,).discount_mount

这是我所做的

class discount_cycle(models.Model):
_inherit = 'sale.order.line'

discount_mount = fields.Float(string="",  required=False , compute='discount_calculation')


@api.depends('product_id','discount','price_subtotal')
def discount_calculation(self):
    for rec in self:
        if rec.discount:
            if rec.product_uom_qty > 1:
                rec.discount_mount = ((rec.price_unit * rec.product_uom_qty) * (rec.discount / 100))
            else:
                rec.discount_mount = (rec.price_unit * (rec.discount / 100))
        pass

请注意,在 odoo V 12 中是 @api.one,那么我该如何解决这个问题,在这种情况下,@api.one 的替代品是什么

在 odoo V13 中,您必须将值分配给计算字段而不是 pass 您需要添加 else 语句并分配默认值

     else:
             self.discount_mount = 0.0

我知道这很清楚,如果我们没有折扣,那么该字段应该是 0.0,但 odoo 希望您这样做

在任何情况下你都需要给non-stored计算字段赋值,即使它是一个假值,如果在计算方法中没有赋值,计算存储字段将保持它们以前的值,所以不要' 依赖任何预期的默认值。

删除了 api.one 装饰器,现在默认为 multi-record。您只需从代码中删除装饰器并循环 self (这在您的示例中已经完成)。

If it uses the values of other fields, it should specify those fields using depends().

您需要将 product_idprice_subtotal 替换为 price_unitproduct_uom_qty

discount0.0 时,discount_mount 也应为 0.0 并且在您的表达式中,您将折扣除以 100 然后执行乘法。如果 discount 的值为 0.0,则不会有问题,表达式将被计算为 0.0,并且 discount_mount 字段将设置为 0.0 这意味着您可以删除 if 表达式:

if rec.discount: