odoo 13販売注文ラインのフィールドを計算する方法は?

Aug 24 2020

販売注文明細の割引フィールドを計算しようとしていますが、この方法は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 V12では@ api.oneだったので、この問題を解決するにはどうすればよいですか。また、この場合の@ api.oneの代わりには何が必要ですか。

回答

3 CharifDZ Aug 24 2020 at 18:25

odoo V13では、ステートメントpassを追加しelseてデフォルト値を割り当てる代わりに、計算フィールドに値を割り当てる必要があります

     else:
             self.discount_mount = 0.0

割引がない場合、これは明らかです。フィールドは0.0である必要がありますが、odooはあなたにそれをしてほしいと思っています。

3 Kenly Aug 24 2020 at 20:37

いずれの場合も、格納されていない計算フィールドに値を割り当てる必要があります。たとえそれが偽のフィールドであっても、計算された格納フィールドは、計算メソッド中に割り当てられない場合、以前の値を保持するため、予想されるデフォルトに依存しないでください。値。

api.oneデコレータは、今では、デフォルトでは、マルチレコードで、削除されました。コードからデコレータを削除してループオーバーするだけですself(これは例ですでに実行されています)。

他のフィールドの値を使用する場合は、depends()を使用してそれらのフィールドを指定する必要があります。

product_idprice_subtotalprice_unitとに置き換える必要がありproduct_uom_qtyます。

ときdiscount0.0discount_mountまたあるべき0.0とあなたの式の中で、あなたはで割引を分割され100、その後の乗算を行います。値場合discount0.0、それが問題になることはありません、式はに評価されます0.0discount_mountフィールドがに設定されます0.0どの削除できることを意味if表現を:

if rec.discount: