How to recompute stored functional field values in Odoo?
In v8.0 (should work in 9.0 too) you can do it like that:
# 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
Above code can be used in server action directly.
In v13 the above syntax still works, but the add_todo should be replaced by add_to_compute:
model = env['account.move']
env.add_to_compute(model._fields['amount_total'], model.search([]))
model.recompute()
To avoid loading all objects into memory use ids instead:
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()
(Because I came here via google:)
You can also do this from the 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 is available in 9, 10 and via an OCA module in 8.