diff --git a/openerp/osv/fields.py b/openerp/osv/fields.py index 76aaadfc2db6d14d0b11da82df194e96c3fd0bfc..f27b737a6b990d168e3a7498140254e3fa317c10 100644 --- a/openerp/osv/fields.py +++ b/openerp/osv/fields.py @@ -671,17 +671,27 @@ class one2many(_column): context = dict(context or {}) context.update(self._context) - res = dict((id, []) for id in ids) - comodel = obj.pool[self._obj].browse(cr, user, [], context) inverse = self._fields_id domain = self._domain(obj) if callable(self._domain) else self._domain domain = domain + [(inverse, 'in', ids)] - for record in comodel.search(domain, limit=self._limit): - # Note: record[inverse] can be a record or an integer! - assert int(record[inverse]) in res - res[int(record[inverse])].append(record.id) + records = comodel.search(domain, limit=self._limit) + record_ids = map(int, records) + + res = dict((id, []) for id in ids) + if record_ids: + cr.execute('SELECT id, %(inverse)s \ + FROM %(rel)s \ + WHERE id in %%s ' % { + 'inverse': inverse, + 'rel': comodel._table, + }, (tuple(record_ids),)) + record_value_id = dict(cr.fetchall()) + # match the result per id, preserving the order + for record in records: + key = record_value_id[record.id] + res[key].append(record.id) return res