【问题标题】:Odoo fields computed for too many records为太多记录计算的 Odoo 字段
【发布时间】:2015-12-21 22:09:19
【问题描述】:

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

因此,我最终从模型中读取了许多记录 - 而 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 总是为孩子的孩子计算。使用&lt;field name="parent_id" /&gt; 也会为所有父母的孩子计算。

【问题讨论】:

    标签: openerp odoo-8


    【解决方案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
    

    【讨论】:

    • 感谢您的回答,但我看不出 @api.depends 装饰器如何减少计算量...为相关记录计算字段不是问题 - 拥有该字段仅为相关记录计算是一个问题。
    • 我真的还是看不出装饰器会如何限制计算。如果装饰器列表中提到的字段发生变化,记录将被重新计算,但它会如何改变第一次计算呢?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多