对于computed字段和onchanges的使用没有严格的规则。
在许多情况下,可以使用computed字段和onchanges来实现相同的结果。始终首选计算字段,因为它们也是在窗体视图上下文之外触发的。永远不要使用onchange将业务逻辑添加到模型中。这是一个非常差的办法,因为在以编程方式创建记录时不会自动触发onchanges;它们仅在表单视图中触发。
computed字段和onchanges的常见陷阱是试图通过添加太多逻辑来简化实现。这可能会产生与预期相反的结果:最终用户被所有自动化所迷惑。
computed字段往往更容易调试:这样的字段值是由给定的方法设置的,因此值发生变更时的时候很容易跟踪。另一方面,onchanges可能会令人困惑:很难知道 onchange 的变化。由于几个 onchange 方法可能会设置相同的字段,因此很难跟踪值的来源。
使用store的computed字段时,请密切注意依赖项。当计算字段依赖于其他计算字段时,更改值可能会触发大量重新计算。这会导致性能不佳。
from odoo import api, fields, models
class TestComputed(models.Model): _name = "test.computed"description = fields.Char(compute="_compute_description", store=True)partner_id = fields.Many2one("res.partner")
@api.depends("partner_id.name")def _compute_description(self): for record in self: record.description = "Test for partner %s" % record.partner_id.name
from odoo import api, fields, models
class TestOnchange(models.Model): _name = "test.onchange"
name = fields.Char(string="Name") description = fields.Char(string="Description") partner_id = fields.Many2one("res.partner", string="Partner")
@api.onchange("partner_id") def _onchange_partner_id(self): self.name = "Document for %s" % (self.partner_id.name) self.description = "Default description for %s" % (self.partner_id.name)