2015-12-21 19 views
1

我在树结构中有一些数据。使用来自孩子的数据计算(未存储)一个字段。 在表单视图中,我显示了计算字段和父字段。因此,我最终从模型中读取了很多记录 - 而且Odoo似乎计算了所有这些记录的计算字段,即使视图只需要一个记录的计算字段。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.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 
+0

谢谢您的回答,但我不能看到@ api.depends装饰怎么会少给我的计算... 有用于计算相关记录的字段不是一个问题 - 有外地来计算只有相关的记录是一个问题。 – cgs

+0

看到这个链接https://github.com/odoo/odoo/blob/9.0/openerp/api.py#L169-L191 –

+0

我真的看不到如何装饰将限制计算。如果修饰器列表中提到的字段发生变化,记录将被重新计算,但它将如何改变第一次计算? – cgs