从其他模型更改字段值

change fields value from other model

在 pos.quotation 模型中我们有状态。所以我的目标是当状态发生变化时,我希望 shoes.order 中名为 "handed" 的布尔字段将变为 true。如果我要在一个模型中进行操作,我知道该怎么做,但是当我需要在其他模型中更改字段时会遇到困难。

class pos_quotation(models.Model):
    _inherit = "pos.quotation"

    @api.onchange('state')
    def handed(self):
        shoes = self.env['shoes.order']
        for rec in self:
            if self.state == "delivery_success":
                rec.shoes.handed = True

在 onchange 中,当您更改值时,self 包含一个虚拟对象 数据库层没有任何反应。 (与依赖计算字段相反)

但在self._origin中传递了原始值。

@api.onchange('state')
def handed(self):
 if self.state == "delivery_success":
              # first try this if it work 
              self._origin.shoes.handed = True

              # if not working then you need to fetch the recorod
              # from the database first.
              shoes = self.env['shoes.order'].search[('id', '=', self.shoes.id)]

              shoes.handed = True

但是在 onchange 事件中这样做可能会导致用户的一些成像问题 他改变了主意并单击取消(放弃更改)但是 shoes.handed 是 已经准备好提交到数据库中。

我的建议是使用相关领域。

class pos_quotation(models.Model):
    _inherit = "pos.quotation"

    # i'm assuming that your m2o field is shoes
    # don't make readonly because you need to save it's changed value
    # when you hit save.
    handed = fields.Boolean(related="shoes.handed")

    @api.onchange('state')
    def handed(self):
        if self.state == "delivery_success": 
               self.handed = True

不要忘记将此字段添加到表单视图并确保它是不可见的 所以用户不要手动更新值

    <field name="handed" invisible="1"/>

希望你明白了。