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
This commit is contained in:
Nicolas Évrard committed 2024-05-25 12:59:45 +02:00
1 parent 56d580ae5b
commit d3e9f3ac5f
2 files changed
+23 -11

No files matched your search

+12 -5
View File
@@ -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):
+11 -6
View File
@@ -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):