From d3e9f3ac5fb957958d3a5e46700e2e5b72f96fc5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicolas=20=C3=89vrard?= Date: Sat, 25 May 2024 12:59:45 +0200 Subject: [PATCH] Use read to fetch reverse field value of x2M field in field get This avoid to create instances for origin or target just to get their id. Closes #13245 --- trytond/trytond/model/fields/many2many.py | 17 ++++++++++++----- trytond/trytond/model/fields/one2many.py | 17 +++++++++++------ 2 files changed, 23 insertions(+), 11 deletions(-) diff --git a/trytond/trytond/model/fields/many2many.py b/trytond/trytond/model/fields/many2many.py index 1602bc43da..daa196a0fe 100644 --- a/trytond/trytond/model/fields/many2many.py +++ b/trytond/trytond/model/fields/many2many.py @@ -139,6 +139,7 @@ class Many2Many(Field): Relation = self.get_relation() origin_field = Relation._fields[self.origin] + reference_key = origin_field._type == 'reference' if origin_field.sortable(Relation): if origin_field._type == 'reference': @@ -154,7 +155,7 @@ class Many2Many(Field): relations = [] for sub_ids in grouped_slice(ids): - if origin_field._type == 'reference': + if reference_key: references = ['%s,%s' % (model.__name__, x) for x in sub_ids] clause = [(self.origin, 'in', references)] else: @@ -162,12 +163,18 @@ class Many2Many(Field): clause += [(self.target, '!=', None)] if self.filter: clause.append((self.target, 'where', self.filter)) - relations.append(Relation.search(clause, order=order)) - relations = Relation.browse(list(chain(*relations))) + relations.append( + [r.id for r in Relation.search(clause, order=order)]) + relations = Relation.read( + list(chain(*relations)), [self.origin, self.target]) for relation in relations: - origin_id = getattr(relation, self.origin).id - res[origin_id].append(getattr(relation, self.target).id) + if reference_key: + _, origin_id = relation[self.origin].split(',', 1) + origin_id = int(origin_id) + else: + origin_id = relation[self.origin] + res[origin_id].append(relation[self.target]) return dict((key, tuple(value)) for key, value in res.items()) def set(self, Model, name, ids, values, *args): diff --git a/trytond/trytond/model/fields/one2many.py b/trytond/trytond/model/fields/one2many.py index d106db7da1..e26a5c394f 100644 --- a/trytond/trytond/model/fields/one2many.py +++ b/trytond/trytond/model/fields/one2many.py @@ -142,12 +142,13 @@ class One2Many(Field): ''' Target = self.get_target() field = Target._fields[self.field] + reference_key = field._type == 'reference' res = {} for i in ids: res[i] = [] if field.sortable(Target): - if field._type == 'reference': + if reference_key: order = [(self.field, None)] else: order = [(self.field + '.id', None)] @@ -159,19 +160,23 @@ class One2Many(Field): order += Target._order targets = [] for sub_ids in grouped_slice(ids): - if field._type == 'reference': + if reference_key: references = ['%s,%s' % (model.__name__, x) for x in sub_ids] clause = [(self.field, 'in', references)] else: clause = [(self.field, 'in', list(sub_ids))] if self.filter: clause.append(self.filter) - targets.append(Target.search(clause, order=order)) - targets = Target.browse(list(chain(*targets))) + targets.append([r.id for r in Target.search(clause, order=order)]) + targets = Target.read(list(chain(*targets)), ['id', self.field]) for target in targets: - origin_id = getattr(target, self.field).id - res[origin_id].append(target.id) + if reference_key: + _, origin_id = target[self.field].split(',', 1) + origin_id = int(origin_id) + else: + origin_id = target[self.field] + res[origin_id].append(target['id']) return dict((key, tuple(value)) for key, value in res.items()) def set(self, Model, name, ids, values, *args):