summaryrefslogtreecommitdiff
path: root/odoo/models.py
diff options
context:
space:
mode:
authorChristophe Simonis <chs@odoo.com>2019-01-07 17:30:57 +0100
committerChristophe Simonis <chs@odoo.com>2019-01-07 17:30:57 +0100
commite1c7fefe89438bbfc669dfec0476921145f8fd5d (patch)
treef408ff54f0d23abb99a00206bb89b0fadcf9603b /odoo/models.py
parent6e933e42efb8e11087db63cfb5302f37f8e8b72d (diff)
parentcdb0c08cb9a3b61466f8cdf368bac831839be8bf (diff)
[MERGE] forward port branch saas-14 up to cdb0c08cb9a
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 c5c10d27eff..38a25c64d86 100644
--- a/odoo/models.py
+++ b/odoo/models.py
@@ -2516,17 +2516,19 @@ class BaseModel(object):
# 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