Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/350.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Odoo:计算来自不同类的字段_Python_Odoo 10 - Fatal编程技术网

Python Odoo:计算来自不同类的字段

Python Odoo:计算来自不同类的字段,python,odoo-10,Python,Odoo 10,我正在开发Odoo10中的一个模块。我有两个类,由一个2多个1字段关联。我已经计算了这两个类中的字段,我想在这两个类的某些字段的值发生变化时触发更新 代码(非常简化) 我想要的是,当其中一个触发器字段更改时,它会更新两个计算字段。 我在一个表格中显示值,带有不同页面的笔记本,分别显示a字段和B字段。我正在使用一个可编辑的树状视图来显示B。 我试过什么: 到目前为止,我只尝试通过更改触发器的值来更新B的字段 1-直接从A类上的compute_vals函数更改值: def compute_v

我正在开发Odoo10中的一个模块。我有两个类,由一个2多个1字段关联。我已经计算了这两个类中的字段,我想在这两个类的某些字段的值发生变化时触发更新

代码(非常简化)

我想要的是,当其中一个触发器字段更改时,它会更新两个计算字段。 我在一个表格中显示值,带有不同页面的笔记本,分别显示a字段和B字段。我正在使用一个可编辑的树状视图来显示B。 我试过什么:

到目前为止,我只尝试通过更改触发器的值来更新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
它什么也不做,但当我点击save时,我得到一个错误:“'a'对象没有属性'\u origin'”

2-从类中的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(),它出现在log中),但是computed_字段_b没有更新

3-将触发器\字段\ a添加到@api.decorator of B方法:

@api.depends('trigger_field_b', 'a_id.trigger_field_a')
什么也没发生

从compute\u vals\u a调用4-Call write()方法。它可以工作,但字段仅在保存后更新

5-将我的b_id字段设置为计算字段:

b_id=fields.One2many('a.b', 'a_id', ondelete='set null', compute  = 'compute_vals_a', readonly = True, store = True)
在这种情况下,当我更改触发器字段时,B类中a的值记录从我的树视图中消失,我检查了我的数据库,似乎没有任何更改,我不知道它们为什么消失。我已经看到,在这种情况下,我不能使用_origin来获取id,我可以像往常一样使用“self.id”来获取id


我尝试过很多方法,比如从a到B创建一个相关字段来触发该方法,使用super()从a调用该方法。。。但似乎什么都不起作用。

将您的@api.dependens更改为@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)中的其他字段一起工作
@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