Openerp 为过多记录计算的Odoo字段

Openerp 为过多记录计算的Odoo字段,openerp,odoo-8,Openerp,Odoo 8,我有一些树状结构的数据。其中一个字段是使用子字段中的数据计算(而不是存储)的。 在表单视图中,我显示了计算字段和父字段 因此,我最终从模型中读取了许多记录,而Odoo似乎为所有这些记录计算了计算字段,即使视图只需要一条记录的计算字段 我认为这是由预取机制引起的,但我尝试在上下文中设置prefetch\u fields=False,但没有帮助 知道如何避免计算所有不必要的值吗?(存储计算字段不是一个选项) 下面是一个简单的示例,介绍该结构: parent_id = fields.Many2one(

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

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

我认为这是由预取机制引起的,但我尝试在上下文中设置
prefetch\u 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
始终为孩子的孩子计算。使用
也会计算所有父项的子项。

您可以使用@api.depends

@api.dependence

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

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

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

谢谢你的回答,但我看不出@api.depends装饰程序会给我更少的计算。。。为相关记录计算字段不是一个问题——只为相关记录计算字段是一个问题。我真的不知道装饰师会如何限制计算。如果decorator列表中提到的字段发生更改,则将重新计算记录,但它将如何更改第一次计算?