@api。取决于或@ api.onchange无法与计算字段一起使用。为什么?

时间:2019-06-02 19:47:01

标签: python odoo odoo-12

在CRM模块的管道记录中,我借助继承添加了一个名为price_difference的Float。该字段是CRM模块中planned_revenuesale_amount_total字段之间的区别。

当我厌倦了使用方法名get_price_diff()时,这对我来说是行不通的。我想将sale_amount_totalplanned_revenue@api.依赖项或@api.onchange一起使用,但现在不起作用。

我的方法的工作很简单,它取决于sale_amount_totalprice_difference字段。如果任何值更改,该方法应运行。

sale_amount_total是基本模块中的计算字段。

我的代码如下。 怎么做?

class rate_record(models.Model):
    _inherit = 'crm.lead'

    price_difference = fields.Float(string='Price Difference', readonly=True)

    @api.onchange('sale_amount_total', 'planned_revenue')
    def get_price_diff(self):
        self.price_different = self.planned_revenue - self.sale_amount_total

3 个答案:

答案 0 :(得分:1)

使用api.depends或api.onchange不能实现您想做的事情,原因仅在于它们不是它们的工作方式(请参阅:HERE)。

您可以使用一种计算方法来做到这一点:

class rate_record(models.Model):
    _inherit = 'crm.lead'

    price_difference = fields.Float(
                           string='Price Difference', 
                           compute='get_price_diff')

    @api.depends('sale_amount_total', 'planned_revenue')
    def get_price_diff(self):
        self.price_different = self.planned_revenue - self.sale_amount_total

答案 1 :(得分:0)

我只能猜测,因为到目前为止,我还没有关于您的代码的所有信息。 onchange方法get_price_diff看起来不错。但是,您将字段设置为readonly=True,这意味着“计算”值将不会保存。

从Odoo 11开始,您可以强制Odoo将带有字段force_save="1"的只读标记字段的值更改保存在字段视图定义中:

<field name="price_difference" force_save="1" />

对于较旧的版本,Github上的OCA存储库中包含模块。例如,对于Odoo 10 web_readonly_bypass

答案 2 :(得分:0)

您的代码:

price_difference = fields.Float(string='Price Difference', readonly=True)

readonly = True-您将无法保存此数据price_difference。

将其删除,然后测试您的代码。应该可以。

我遇到了同样的问题,它会更新,但是当我保存它时,它就会消失。不确定这是否是您的问题,因为您的问题含糊(您是什么意思,它现在不起作用?不保存数据?如果是这种情况,那么我的解决方案将为您效劳)