Commit 5e2c4d7a authored by Attila Tovt's avatar Attila Tovt Committed by Tim Graham
Browse files

Fixed #26264 -- Fixed prefetch_related() crashes with values_list(flat=True)

parent 3389c5ea
Loading
Loading
Loading
Loading
+6 −5
Original line number Diff line number Diff line
@@ -1421,11 +1421,12 @@ def prefetch_related_objects(model_instances, *related_lookups):
                if not hasattr(obj, '_prefetched_objects_cache'):
                    try:
                        obj._prefetched_objects_cache = {}
                    except AttributeError:
                        # Must be in a QuerySet subclass that is not returning
                        # Model instances, either in Django or 3rd
                        # party. prefetch_related() doesn't make sense, so quit
                        # now.
                    except (AttributeError, TypeError):
                        # Must be an immutable object from
                        # values_list(flat=True), for example (TypeError) or
                        # a QuerySet subclass that isn't returning Model
                        # instances (AttributeError), either in Django or a 3rd
                        # party. prefetch_related() doesn't make sense, so quit.
                        good_objects = False
                        break
            if not good_objects:
+11 −0
Original line number Diff line number Diff line
@@ -44,6 +44,17 @@ class UUIDPrefetchRelated(TestCase):
        with self.assertNumQueries(0):
            self.assertEqual(2, len(flea.pets_visited.all()))

    def test_prefetch_related_from_uuid_model_to_uuid_model_with_values_flat(self):
        pet = Pet.objects.create(name='Fifi')
        pet.people.add(
            Person.objects.create(name='Ellen'),
            Person.objects.create(name='George'),
        )
        self.assertSequenceEqual(
            Pet.objects.prefetch_related('fleas_hosted').values_list('id', flat=True),
            [pet.id]
        )


class UUIDPrefetchRelatedLookups(TestCase):