从其他模型更改字段值

时间:2017-10-18 14:35:26

标签: openerp odoo-8 odoo-9

在pos.quotation模型中我们有状态。所以我的目标是当状态发生变化时我希望鞋子中的布尔字段命名为" hand"会变成真的。我知道如果我在一个模型中做这个怎么做,但是当我需要在其他模型中改变字段时我会挣扎。

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

1 个答案:

答案 0 :(得分:1)

在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是 al ready已在数据库中提交。

我的道具是使用相关领域。

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"/>
希望你明白这一点。