为太多记录计算的Odoo字段

时间:2015-12-21 22:09:19

标签: openerp odoo-8

我在树形结构中有一些数据。使用来自孩子的数据计算(未存储)其中一个字段。 在表单视图中,我显示计算字段和父字段。

因此,我最终从模型中读取了许多记录 - 而Odoo似乎计算了所有这些记录的计算字段,即使视图只需要一条记录的计算字段。

我认为这是由预取机制引起的,但我尝试在上下文中设置prefetch_fields=False,但这并没有帮助。

知道如何避免计算所有不必要的值吗? (存储计算字段不是一种选择)。

快速举例说明构造:

parent_id = fields.Many2one(...)
child_ids = fields.One2many(...) # Inverse parent relation
comp = fields.Integer(compute="_compute_comp")

@api.one
def _compute_comp(self):
    sum = 0
    for c in self.child_ids:
        sum += c._get_complicated_value()
    self.comp = sum

和视图:

<field name="parent_id" />
<field name="comp" />
始终为孩子的孩子计算

comp。使用<field name="parent_id" />,还可以计算所有父亲的孩子。

1 个答案:

答案 0 :(得分:1)

你可以使用@ api.depends

<强> @ api.depends

如果装饰器中指定的任何字段被ORM更改或在表单中更改,则此装饰器将触发对装饰函数的调用:

@api.depends('name', 'an_other_field')
def afun(self):
   pass
  

注意

     

当你重新定义取决于你必须重新定义所有@ api.depends,所以它   失去了他的一些兴趣。

新API的一个重大改进是,依赖项会以简单的方式自动插入到表单中。您不必再担心修改视图了。

@api.one
@api.depends('child_ids')
def _compute_comp(self):
    sum = 0
    for c in self.child_ids:
       sum += c._get_complicated_value()
    self.comp = sum