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