我在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调用方法......但似乎没什么用。
答案 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