summaryrefslogtreecommitdiff
path: root/odoo/models.py
diff options
context:
space:
mode:
Diffstat (limited to 'odoo/models.py')
-rw-r--r--odoo/models.py22
1 files changed, 12 insertions, 10 deletions
diff --git a/odoo/models.py b/odoo/models.py
index 8e2ad831875..d426789c757 100644
--- a/odoo/models.py
+++ b/odoo/models.py
@@ -2766,17 +2766,19 @@ class BaseModel(MetaModel('DummyModel', (object,), {'_register': False})):
# retrieve results from records; this takes values from the cache and
# computes remaining fields
- result = []
- name_fields = [(name, self._fields[name]) for name in (stored + inherited + computed)]
+ data = {record: {'id': record.id} for record in self}
+ missing = set()
use_name_get = (load == '_classic_read')
- for record in self:
- try:
- values = {'id': record.id}
- for name, field in name_fields:
- values[name] = field.convert_to_read(record[name], record, use_name_get)
- result.append(values)
- except MissingError:
- pass
+ for name in (stored + inherited + computed):
+ convert = self._fields[name].convert_to_read
+ # read every field with prefetching limited to self; this avoids
+ # computing fields on a larger recordset than self
+ for record in self.with_prefetch():
+ try:
+ data[record][name] = convert(record[name], record, use_name_get)
+ except MissingError:
+ missing.add(record)
+ result = [data[record] for record in self if record not in missing]
return result