如何重新计算 Odoo 中存储的功能字段值?
How to recompute stored functional field values in Odoo?
有时必须重新计算存储的字段,但无法启动触发器(例如,在 SQL 注入的情况下)。
如何以简单的方式重新计算它们?
在 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
以上代码可直接用于服务器操作。
(因为我是通过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 模块可用。
在 odoo11
env.add_todo(model._fields['loading_time'], env['product.product'].search([]))
model.recompute()
在 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()
有时必须重新计算存储的字段,但无法启动触发器(例如,在 SQL 注入的情况下)。
如何以简单的方式重新计算它们?
在 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
以上代码可直接用于服务器操作。
(因为我是通过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 模块可用。
在 odoo11
env.add_todo(model._fields['loading_time'], env['product.product'].search([]))
model.recompute()
在 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()