diff --git a/django/db/models/fields/related.py b/django/db/models/fields/related.py
index 82e7725..92b85a6 100644
--- a/django/db/models/fields/related.py
+++ b/django/db/models/fields/related.py
@@ -310,17 +310,14 @@ class ReverseSingleRelatedObjectDescriptor(six.with_metaclass(RenameRelatedObjec
         instance_attr = self.field.get_local_related_value
         instances_dict = dict((instance_attr(inst), inst) for inst in instances)
         related_field = self.field.foreign_related_fields[0]
-
-        # FIXME: This will need to be revisited when we introduce support for
-        # composite fields. In the meantime we take this practical approach to
-        # solve a regression on 1.6 when the reverse manager in hidden
-        # (related_name ends with a '+'). Refs #21410.
-        if self.field.rel.is_hidden():
-            query = {'%s__in' % related_field.name: set(instance_attr(inst)[0] for inst in instances)}
-        else:
-            query = {'%s__in' % self.field.related_query_name(): instances}
-
-        qs = self.get_queryset(instance=instances[0]).filter(**query)
+        
+        related_pks = set()
+        for instance in instances:
+            related_pk = getattr(instance, self.field.attname)
+            if related_pk is not None:
+                related_pks.add(related_pk)
+        
+        qs = self.get_queryset(instance=instances[0]).filter(pk__in = related_pks)
         # Since we're going to assign directly in the cache,
         # we must manage the reverse relation cache manually.
         if not self.field.rel.multiple:
diff --git a/tests/prefetch_related/tests.py b/tests/prefetch_related/tests.py
index 5dfca0f..bf09ae8 100644
--- a/tests/prefetch_related/tests.py
+++ b/tests/prefetch_related/tests.py
@@ -996,3 +996,27 @@ class Ticket21410Tests(TestCase):
 
     def test_bug(self):
         list(Author2.objects.prefetch_related('first_book', 'favorite_books'))
+
+
+class Ticket21760Tests(TestCase):
+
+    def setUp(self):
+        for _ in xrange(3):
+            house = House.objects.create()
+            for _ in xrange(3):
+                Room.objects.create(house = house)
+
+    @override_settings(DEBUG=True)
+    def test_bug(self):
+        rooms = list(Room.objects.all().prefetch_related('house'))
+
+        house_ids = {
+            r.house_id for r in rooms
+            if r.house_id
+        }
+
+        prefetch_query = connection.queries[-1]['sql']
+        lookup_id_str = prefetch_query.split('- PARAMS = ')[1]
+        lookup_ids = set(map(int, lookup_id_str[1:-1].split(', ')))
+
+        self.assertEqual(house_ids, lookup_ids)
