From 5e2c4d7afbaeec196aedb9888a47e0b635ff55d4 Mon Sep 17 00:00:00 2001 From: Attila Tovt Date: Fri, 26 Feb 2016 07:28:48 +0200 Subject: [PATCH] Fixed #26264 -- Fixed prefetch_related() crashes with values_list(flat=True) --- django/db/models/query.py | 11 ++++++----- tests/prefetch_related/test_uuid.py | 11 +++++++++++ 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/django/db/models/query.py b/django/db/models/query.py index 82074d700b..ace55a5da2 100644 --- a/django/db/models/query.py +++ b/django/db/models/query.py @@ -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: diff --git a/tests/prefetch_related/test_uuid.py b/tests/prefetch_related/test_uuid.py index 8d885e1057..08930fc5f4 100644 --- a/tests/prefetch_related/test_uuid.py +++ b/tests/prefetch_related/test_uuid.py @@ -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):