我在树结构中有一些数据 . 使用来自孩子的数据计算(未存储)其中一个字段 . 在表单视图中,我显示计算字段和父字段 .
因此,我最终从模型中读取了许多记录 - 并且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 回答
你可以使用@ api.depends
@api.depends
如果装饰器中指定的任何字段被ORM更改或在表单中更改,则此装饰器将触发对装饰函数的调用:
新API的一个重大改进是,依赖项会以简单的方式自动插入到表单中 . 您不必再担心修改视图了 .