summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAttila Tovt <uran198@gmail.com>2016-02-26 07:28:48 +0200
committerTim Graham <timograham@gmail.com>2016-02-26 19:26:15 -0500
commit5e2c4d7afbaeec196aedb9888a47e0b635ff55d4 (patch)
tree16d01ef0d5c23894118ea5b0cb170745201e556b
parent3389c5ea229884a1943873fe7e7ffc2800cefc22 (diff)
Fixed #26264 -- Fixed prefetch_related() crashes with values_list(flat=True)
-rw-r--r--django/db/models/query.py11
-rw-r--r--tests/prefetch_related/test_uuid.py11
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):