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

我正在尝试计算销售订单行上的折扣字段,并且该方法在 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


慕妹3242003
浏览 131回答 2
2回答

慕桂英4014372

在 odoo V13 中,您必须将值分配给计算字段,而不是pass需要添加else语句并分配默认值&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else: &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.discount_mount&nbsp;=&nbsp;0.0我知道这很清楚,如果我们没有折扣,那么该字段应该是 0.0,但 odoo 希望你这样做

慕的地6264312

在任何情况下都需要为非存储计算字段分配一个值,即使它是假的,如果在计算方法期间未分配,计算存储字段将保留其先前的值,因此不要依赖任何预期的默认值价值。装饰api.one器被移除,现在默认为多记录。您只需从代码中删除装饰器并循环self(这在您的示例中已经完成)。如果它使用其他字段的值,则应使用depends()指定这些字段。您需要将product_idand替换price_subtotal为price_unitand product_uom_qty。当discount是 时0.0,也discount_mount应该是0.0并且在您的表达式中,您将折扣除以然后100进行乘法。discount如果的值为0.0,则不会有问题,表达式将被计算为0.0并且discount_mount字段将设置为0.0这意味着您可以删除if表达式:if rec.discount:
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python