diff --git a/django/db/models/fields/related.py b/django/db/models/fields/related.py
index 82e7725..46a81ff 100644
a
|
b
|
class ReverseSingleRelatedObjectDescriptor(six.with_metaclass(RenameRelatedObjec
|
309 | 309 | rel_obj_attr = self.field.get_foreign_related_value |
310 | 310 | instance_attr = self.field.get_local_related_value |
311 | 311 | instances_dict = dict((instance_attr(inst), inst) for inst in instances) |
312 | | related_field = self.field.foreign_related_fields[0] |
| 312 | related_fields = self.field.foreign_related_fields |
313 | 313 | |
314 | 314 | # FIXME: This will need to be revisited when we introduce support for |
315 | 315 | # composite fields. In the meantime we take this practical approach to |
316 | 316 | # solve a regression on 1.6 when the reverse manager in hidden |
317 | 317 | # (related_name ends with a '+'). Refs #21410. |
318 | | if self.field.rel.is_hidden(): |
319 | | query = {'%s__in' % related_field.name: set(instance_attr(inst)[0] for inst in instances)} |
| 318 | if self.field.rel.is_hidden() or len(related_fields) == 1: |
| 319 | query = {'%s__in' % related_fields[0].name: set(inst_attrs[0] for inst_attrs in instances_dict.keys())} |
320 | 320 | else: |
321 | 321 | query = {'%s__in' % self.field.related_query_name(): instances} |
322 | 322 | |
diff --git a/tests/prefetch_related/tests.py b/tests/prefetch_related/tests.py
index 5dfca0f..3bd6ec3 100644
a
|
b
|
class Ticket21410Tests(TestCase):
|
996 | 996 | |
997 | 997 | def test_bug(self): |
998 | 998 | list(Author2.objects.prefetch_related('first_book', 'favorite_books')) |
| 999 | |
| 1000 | |
| 1001 | class Ticket21760Tests(TestCase): |
| 1002 | |
| 1003 | def setUp(self): |
| 1004 | for _ in xrange(3): |
| 1005 | house = House.objects.create() |
| 1006 | for _ in xrange(3): |
| 1007 | Room.objects.create(house = house) |
| 1008 | |
| 1009 | @override_settings(DEBUG=True) |
| 1010 | def test_bug(self): |
| 1011 | with self.assertNumQueries(2): |
| 1012 | rooms = list(Room.objects.all().prefetch_related('house')) |
| 1013 | |
| 1014 | house_ids = { |
| 1015 | r.house_id for r in rooms |
| 1016 | if r.house_id |
| 1017 | } |
| 1018 | |
| 1019 | prefetch_query = connection.queries[-1]['sql'] |
| 1020 | lookup_id_str = prefetch_query.split('- PARAMS = ')[1] |
| 1021 | lookup_ids = set(map(int, lookup_id_str[1:-1].split(', '))) |
| 1022 | |
| 1023 | self.assertEqual(house_ids, lookup_ids) |