【发布时间】: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 调用方法...但似乎没有任何效果。
【问题讨论】: