Odoo:计算不同类别的字段
问题描述:
我在Odoo 10中开发一个模块。我有两个与One2many-Many2one字段相关的类。我已经计算了两个类中的字段,并且我想在两个类的某些字段的值更改时触发更新。Odoo:计算不同类别的字段
代码(非常简化的)
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
我要的是,当触发领域的一个改变都更新计算领域。 我使用不同页面的笔记本在窗体中显示值,以分别显示字段和B字段。我使用的是可编辑的树视图显示B. 有什么我想:
到现在为止我只试图通过改变trigger_field_a的值更新B的领域
1-变化直接从compute_vals函数值对A类:
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
它什么都不做,但是当我点击保存我得到一个错误:“‘一’对象有没有属性‘_origin’”从内部方法B级
2调用方法在A班:
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不更新。
trigger_field_a到@ 3-添加api.depends B法的装饰:
@api.depends('trigger_field_b', 'a_id.trigger_field_a')
什么也没有发生
4-呼叫写()从compute_vals_a方法。它可以工作,但字段只有在保存后才会更新。
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类从我的树视图中消失,我检查了我的DB,似乎没有什么变化,我不知道他们为什么消失。我已经看到,在这种情况下,我不能使用_origin获得id,并且我可以通过“self.id”获取id。
我试过很多东西,比如从A创建相关字段到B来触发该方法,使用super()从A中调用方法...但似乎没有任何工作。
答
改变你@ 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处更改任何值时,它不会被调用,但它仍然可以与decorator中的其他字段一起使用(trigger_field_b) – Almir