diff options
| author | François Freitag <mail@franek.fr> | 2017-03-03 18:45:31 -0800 |
|---|---|---|
| committer | Tim Graham <timograham@gmail.com> | 2017-05-04 09:17:29 -0400 |
| commit | c0a2b9508aa2c6eaa22e9787010276edca887f0b (patch) | |
| tree | 011a500063926e0f754d342afff242caa28e4efd /django | |
| parent | 16121da78d7a522bf6b6e5fe704eb655b9ab442d (diff) | |
Fixed #27554 -- Fixed prefetch_related() crash when fetching relations in nested Prefetches.
Diffstat (limited to 'django')
| -rw-r--r-- | django/db/models/query.py | 13 |
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 |
