diff --git a/modelcluster/fields.py b/modelcluster/fields.py index cc78136..e7ca355 100644 --- a/modelcluster/fields.py +++ b/modelcluster/fields.py @@ -397,7 +397,9 @@ def get_prefetch_queryset(self, instances, queryset=None): def _apply_rel_filters(self, queryset): # Required for get_prefetch_queryset. - return queryset._next_is_sticky() + # NOTE: _apply_rel_filters() must return a copy of the queryset + # to work correctly with prefetch + return queryset._next_is_sticky().all() def get_object_list(self): """ diff --git a/tests/tests/test_cluster.py b/tests/tests/test_cluster.py index adc6dc1..683eae2 100644 --- a/tests/tests/test_cluster.py +++ b/tests/tests/test_cluster.py @@ -1311,3 +1311,19 @@ def test_prefetch_related_with_lookup(self): res = list(query) self.assertEqual(query[0].menu_items.all()[0], menu_item1) self.assertEqual(query[1].menu_items.all()[0], menu_item2) + + def test_m2m_prefetch_related_with_lookup(self): + person1 = Person.objects.create(name='Joe') + person2 = Person.objects.create(name='Mary') + room = Room.objects.create(name='Dining room') + house = House.objects.create(name='House 1', address='123 Main St', owner=person1, main_room=room) + person1.houses = [house] + person1.save() + + query = Person.objects.all().prefetch_related( + Prefetch('houses', queryset=House.objects.all()) + ) + + res = list(query) + self.assertEqual(query[0], person1) + self.assertEqual(query[0].houses.count(), 1)