From 877fe07f7418e2a70256ec0f2127e8007604ba1d Mon Sep 17 00:00:00 2001 From: Moens Alexandre Date: Thu, 20 Dec 2018 16:06:34 +0000 Subject: [PATCH] [FIX] base: optimize the reading of many2one property fields back port of commit 9820191d33f773ae21ca405da0e1226b6657ef5b (made for v11) project : Performance Issues task : Geostaff : Success Pack 5 (100h) (opw-1912303) closes odoo/odoo#29689 --- odoo/addons/base/res/ir_property.py | 29 ++++++++++++++++++++++++----- 1 file changed, 24 insertions(+), 5 deletions(-) diff --git a/odoo/addons/base/res/ir_property.py b/odoo/addons/base/res/ir_property.py index bedea3fa243..97ce43e2eea 100644 --- a/odoo/addons/base/res/ir_property.py +++ b/odoo/addons/base/res/ir_property.py @@ -160,11 +160,30 @@ class Property(models.Model): # note: order by 'company_id asc' will return non-null values first props = self.search(domain, order='company_id asc') result = {} - for prop in props: - # for a given res_id, take the first property only - id = refs.pop(prop.res_id, None) - if id is not None: - result[id] = prop.get_by_record() + field = self.env[model]._fields[name] + if field.type == 'many2one': + # optimization for many2one fields + Comodel = self.env[field.comodel_name] + co_ids = set() + for prop in props: + # for a given res_id, take the first property only + id = refs.pop(prop.res_id, None) + if id is not None: + val = prop.value_reference + if val: + val = int(val.split(',')[1]) + co_ids.add(val) + result[id] = val + # check for existence in batch, and update result accordingly + existing = {rec.id: rec for rec in Comodel.browse(co_ids).exists()} + result = {id: existing.get(val, Comodel) for id, val in result.items()} + + else: + for prop in props: + # for a given res_id, take the first property only + id = refs.pop(prop.res_id, None) + if id is not None: + result[id] = prop.get_by_record() # set the default value to the ids that are not in result default_value = result.pop(False, False)