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 
+0

谢谢,但没有奏效。它甚至不会在方法中显示_logger.error消息,所以当我在A处更改任何值时,它不会被调用,但它仍然可以与decorator中的其他字段一起使用(trigger_field_b) – Almir