and3p
and3p

Reputation: 1014

How to recompute stored functional field values in Odoo?

Sometimes stored fields must be recomputed, but triggers can not be launched (e.g. in case of SQL injection).

How to recompute them an easy way?

Upvotes: 12

Views: 12425

Answers (4)

Robrecht
Robrecht

Reputation: 111

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()

Upvotes: 11

龙美凤
龙美凤

Reputation: 11

in the odoo11

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

Upvotes: -1

RoelAdriaans
RoelAdriaans

Reputation: 803

(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.

Upvotes: 18

and3p
and3p

Reputation: 1014

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.

Upvotes: 7

Related Questions