summaryrefslogtreecommitdiff
path: root/django
diff options
context:
space:
mode:
authorFrançois Freitag <mail@franek.fr>2017-03-03 18:45:31 -0800
committerTim Graham <timograham@gmail.com>2017-05-04 09:17:29 -0400
commitc0a2b9508aa2c6eaa22e9787010276edca887f0b (patch)
tree011a500063926e0f754d342afff242caa28e4efd /django
parent16121da78d7a522bf6b6e5fe704eb655b9ab442d (diff)
Fixed #27554 -- Fixed prefetch_related() crash when fetching relations in nested Prefetches.
Diffstat (limited to 'django')
-rw-r--r--django/db/models/query.py13
1 files changed, 9 insertions, 4 deletions
diff --git a/django/db/models/query.py b/django/db/models/query.py
index 7302a1dfee..1cc5217d0e 100644
--- a/django/db/models/query.py
+++ b/django/db/models/query.py
@@ -1423,10 +1423,15 @@ def prefetch_related_objects(model_instances, *related_lookups):
# that we can continue with nullable or reverse relations.
new_obj_list = []
for obj in obj_list:
- try:
- new_obj = getattr(obj, through_attr)
- except exceptions.ObjectDoesNotExist:
- continue
+ if through_attr in getattr(obj, '_prefetched_objects_cache', ()):
+ # If related objects have been prefetched, use the
+ # cache rather than the object's through_attr.
+ new_obj = list(obj._prefetched_objects_cache.get(through_attr))
+ else:
+ try:
+ new_obj = getattr(obj, through_attr)
+ except exceptions.ObjectDoesNotExist:
+ continue
if new_obj is None:
continue
# We special-case `list` rather than something more generic