【问题标题】:Odoo: Compute fields from different classesOdoo:计算来自不同类的字段
【发布时间】:2017-05-26 07:50:55
【问题描述】:

我正在 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' object has no attribute '_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”获取 id

我尝试了很多方法,例如创建从 A 到 B 的相关字段来触发方法,使用 super() 从 A 调用方法...但似乎没有任何效果。

【问题讨论】:

    标签: python odoo-10


    【解决方案1】:

    像这样将@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
    

    【讨论】:

    • 谢谢,但没用。它甚至没有在方法内部显示 _logger.error 消息,因此当我更改 A 处的任何值时它不会被调用,但它仍然适用于装饰器 (trigger_field_b) 中的其他字段
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-18
    • 2013-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多