使用从Onchange调用的Write函数更新One2many Record(Odoo10)

时间:2017-10-24 13:21:12

标签: eclipse openerp

我正在尝试在调用Onchange方法时更新我的​​One2many记录。我正在获取确切的值,但它没有更新字段。我都没有收到任何错误。

class abc_1(models.Model):
    _name = 'abc.1'                

    field_a1 = fields.Many2one('crm.team',required=True)
    field_a2 = fields.One2many('abc.2', 'field_b1')  

    @api.onchange('field_a1')
    @api.depends('field_a1')
    def get_records(self):    
        for res in self.field_a1.member_ids:
            print res.name 
            self.write({'field_a2':(0,0,'field_b2':res.name})]})    

class abc_2(models.Model):
    _name = 'abc.2'

    field_b1 = fields.Many2one("abc.1")    
    field_b2 = fields.Char(string='Sales Person')

我正在尝试更新已获取的记录,但它没有做任何事情。

1 个答案:

答案 0 :(得分:3)

首次@api.depends触发onchange事件,因此您不需要 @ api.onchange。

第二个不要在onchange事件中更新数据库,因为你将提交 如果用户单击取消按钮更改,则更改数据库 所有准备好保存在数据库中

第三,如果这个代码可以很好地查询数据库,因为任何写入调用都将在数据库中执行更新。只有在没有其他解决方案的情况下才能在循环内查询数据库

四个self.write在@api.onchange中不起作用,因为self不是记录不是真正的记录它只是一个保存从中传递的数据的虚拟记录 在客户端,即使记录保存在数据库中,您也可以检查找到的id始终是NewID对象。通常你会在self._origin中找到真实记录(在新API中,或旧API中的ID列表) 这可以调用write并更改数据库中的值是一件危险的事情

@api.depends('field_a1')
def get_records(self):
    # when you use depends, best thing you do is to loop so won't get
    # singleton error
    for rec in self
        # create a list to hold the cammands to create the records
        res_ids = []
        for res in self.field_a1.member_ids:
            # now just add the cammand to the list
            res_ids.append((0,0,{
                'field_b2':res.name,
            })
        # if you will affect only one element just 
        # but if more use rec.update() works like rec.write()
        # but with onchange it don't save data in database.
        rec.field_a2 = res_ids