summaryrefslogtreecommitdiff
path: root/odoo/fields.py
diff options
context:
space:
mode:
Diffstat (limited to 'odoo/fields.py')
-rw-r--r--odoo/fields.py31
1 files changed, 31 insertions, 0 deletions
diff --git a/odoo/fields.py b/odoo/fields.py
index 8e940a3a387..b936d6c83fd 100644
--- a/odoo/fields.py
+++ b/odoo/fields.py
@@ -809,6 +809,21 @@ class Field(MetaField('DummyField', (object,), {})):
self.update_db_column(model, column)
self.update_db_notnull(model, column)
+ # optimization for computing simple related fields like 'foo_id.bar'
+ if (
+ not column
+ and len(self.related or ()) == 2
+ and self.related_field.store and not self.related_field.compute
+ ):
+ join_field = model._fields[self.related[0]]
+ if (
+ join_field.type == 'many2one'
+ and join_field.store and not join_field.compute
+ ):
+ model.pool.post_init(self.update_db_related, model)
+ # discard the "classical" computation
+ return False
+
return not column
def update_db_column(self, model, column):
@@ -859,6 +874,22 @@ class Field(MetaField('DummyField', (object,), {})):
elif not self.required and has_notnull:
sql.drop_not_null(model._cr, model._table, self.name)
+ def update_db_related(self, model):
+ """ Compute a stored related field directly in SQL. """
+ comodel = model.env[self.related_field.model_name]
+ model.env.cr.execute("""
+ UPDATE "{model_table}" AS x
+ SET "{model_field}" = y."{comodel_field}"
+ FROM "{comodel_table}" AS y
+ WHERE x."{join_field}" = y.id
+ """.format(
+ model_table=model._table,
+ model_field=self.name,
+ comodel_table=comodel._table,
+ comodel_field=self.related[1],
+ join_field=self.related[0],
+ ))
+
############################################################################
#
# Alternatively stored fields: if fields don't have a `column_type` (not