首页 文章

为太多记录计算的Odoo字段

提问于
浏览
1

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

因此,我最终从模型中读取了许多记录 - 并且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 回答

  • 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
    

相关问题