我在树形结构中有一些数据。使用来自孩子的数据计算(未存储)其中一个字段。 在表单视图中,我显示计算字段和父字段。
因此,我最终从模型中读取了许多记录 - 而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" />
,还可以计算所有父亲的孩子。
答案 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