【问题标题】:How to recompute stored functional field values in Odoo?如何重新计算 Odoo 中存储的功能字段值?
【发布时间】:2015-12-04 13:23:35
【问题描述】:

有时必须重新计算存储的字段,但无法启动触发器(例如在 SQL 注入的情况下)。

如何以简单的方式重新计算它们?

【问题讨论】:

    标签: openerp odoo-8


    【解决方案1】:

    (因为我是通过google来到这里的:)

    您也可以通过 Odoo Shell 执行此操作:

    # python odoo.py shell -c openerp-server.conf  -d <database>
    
    >>> model = env['account.invoice']
    >>> env.add_todo(model._fields['amount_total'], model.search([]))
    >>> model.recompute()
    >>> env.cr.commit()
    

    Odoo shell 在 9、10 和 8 中通过 OCA 模块可用。

    【讨论】:

      【解决方案2】:

      在 v13 中,上述语法仍然有效,但 add_todo 应替换为 add_to_compute:

      model = env['account.move']
      env.add_to_compute(model._fields['amount_total'], model.search([]))
      model.recompute()
      

      为避免将所有对象加载到内存中,请改用 id:

      model = env['account.move']
      ids = [x.get('id') for x in model.search_read(domain, ['id'])]
      env.all.tocompute[model._fields['amount_total']].update(ids)
      model.recompute()
      

      【讨论】:

      • 我必须执行 env.cr.commit() 才能看到更改
      • model.recompute() 在 v14 中不需要。 add_to_compute 就足够了。
      【解决方案3】:

      在 v8.0 中(也应该在 9.0 中工作)你可以这样做:

      # Recompute amount_total for account.invoice
      
      env.add_todo(model._fields['amount_total'], object)
      model.recompute()
      
      # where
      # object - recordset of instances to recompute field for
      # model - recordset instances model
      

      以上代码可直接用于服务器动作。

      【讨论】:

        【解决方案4】:

        在odoo11中

        env.add_todo(model._fields['loading_time'], env['product.product'].search([]))
        model.recompute()
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2022-12-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多