我在树结构中有一些数据。其中一个字段是使用子字段的数据计算(而不是存储)的。在表单视图中,我显示了计算字段和父字段。
因此,我最终从模型中读取了许多记录,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