Odoo:计算来自不同类的字段

时间:2017-05-26 07:50:55

标签: python odoo-10

我在Odoo 10中开发了一个模块。我有两个与One2many-Many2one字段相关的类。我计算了两个类中的字段,并且我希望在两个类的某些字段的值发生更改时触发更新。

代码(非常简化)

class A(models.Model):
    _name='a'
    b_id=fields.One2many('a.b', 'a_id', ondelete='set null')

    computed_field_a = fields.Float(compute  = 'compute_vals_a', readonly = True, store = True)
    trigger_field_a = fields.Float()

    @api.multi
    @api.depends('trigger_field_a')
    def compute_vals_a(self):
        pass

class B(models.Model):
    _name='a.b'
    a_id=fields.Many2one('a', ondelete='cascade')

    compute_field_b = fields.Float(compute  = 'compute_vals_b', readonly = True, store = True)
    trigger_field_b = fields.Float()

    @api.multi
    @api.depends('trigger_field_b')
    def compute_vals_b(self):
        for r in self:
            for rr in r.a_id:
                r.compute_field_b = r.trigger_field_b * rr.trigger_field_a

我想要的是当其中一个触发器字段发生更改时,它会更新两个计算字段。 我在带有不同页面的笔记本的表单中显示值,以分别显示A字段和B字段。我使用可编辑的树视图来显示B. 我尝试了什么:

到目前为止,我只是尝试通过更改trigger_field_a的值来更新B的字段

1 - 直接从A类的compute_vals函数更改值:

    def compute_vals(self):
        b_vals=self.env['a.b'].search([('a_id', '=', self._origin.id)])
        for r in b_vals:
            r.compute_field_b = r.trigger_field_b * self.trigger_field_a

它什么也没做,但当我点击保存时,我收到一个错误:"' a'对象没有属性' _origin'"

2-A类中的B类内部方法调用方法:

    def compute_vals(self):
        for r in self:
            for rr in r.a_id:
                r.compute_field_b = r.trigger_field_b * rr.trigger_field_a
        b_vals=self.env['a.b'].search([('a_id', '=', self._origin.id)])
        for r in b_vals:
            r.compute_vals_b()

我检查是否调用了compute_vals_b(我在里面放了一个_logger.error()并且它出现在日志中),但是没有更新computed_field_b。

3 - 将trigger_field_a添加到B方法的@ api.depends装饰器:

@api.depends('trigger_field_b', 'a_id.trigger_field_a')

什么都没发生

4 - 从compute_vals_a调用write()方法。它可以工作,但字段只有在保存后才会更新。

5 - 将我的b_id字段设为计算字段:

b_id=fields.One2many('a.b', 'a_id', ondelete='set null', compute  = 'compute_vals_a', readonly = True, store = True)

在这种情况下,当我更改trigger_field_a的B类值记录从我的树状视图中消失时,我已经检查了我的数据库,似乎没有任何变化,我不知道为什么他们消失。我已经看到,在这种情况下,我无法使用_origin来获取ID,我可以像往常一样使用" self.id"

我尝试过很多东西,例如从A到B创建一个相关的字段来触发方法,使用super()从A调用方法......但似乎没什么用。

1 个答案:

答案 0 :(得分:0)

将@ api.depends更改为@ api.onchange,如下所示:

@api.onchange('trigger_field_b', 'a_id')
def compute_vals_b(self):
    for r in self:
        for rr in r.a_id:
            r.compute_field_b = r.trigger_field_b * rr.trigger_field_a