为太多记录计算的Odoo字段



我在树结构中有一些数据。其中一个字段是使用子字段的数据计算(而不是存储)的。在表单视图中,我显示了计算字段和父字段。

因此,我最终从模型中读取了许多记录,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" />

CCD_ 2总是为孩子的孩子计算的。对于<field name="parent_id" />,它也是为父代的所有子代计算的。

您可以使用@api.depends

@api.取决于

如果装饰器中指定的任何字段被ORM更改或以以下形式更改,则该装饰器将触发对装饰函数的调用:

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

注意

当你重新定义dependent时,你必须重新定义所有的@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

最新更新