diff options
| author | Loic Bistuer <loic.bistuer@gmail.com> | 2014-05-19 03:43:13 +0700 |
|---|---|---|
| committer | Loic Bistuer <loic.bistuer@gmail.com> | 2014-05-21 10:37:00 +0700 |
| commit | 24a41ecc3590f8d92d085d4a4caa5f8bf962ceae (patch) | |
| tree | d8c4f67b55a1bd550e4e03e38c3e15f4d78131d6 /django | |
| parent | 0007a43198670a1716bc5ff2d0a659daa4c7cf63 (diff) | |
[1.7.x] Fixed #22650 -- Fixed regression on prefetch_related.
Regression from f51c1f59 when using select_related then prefetch_related
on the reverse side of an O2O:
Author.objects.select_related('bio').prefetch_related('bio__books')
Thanks Aymeric Augustin for the report and tests. Refs #17001.
Backport of bdf3473e64 from master
Diffstat (limited to 'django')
| -rw-r--r-- | django/db/models/query.py | 17 |
1 files changed, 7 insertions, 10 deletions
diff --git a/django/db/models/query.py b/django/db/models/query.py index abe882eaeb..d518b012b7 100644 --- a/django/db/models/query.py +++ b/django/db/models/query.py @@ -1791,15 +1791,6 @@ def prefetch_related_objects(result_cache, related_lookups): done_queries[prefetch_to] = obj_list auto_lookups.extend(normalize_prefetch_lookups(additional_lookups, prefetch_to)) followed_descriptors.add(descriptor) - elif isinstance(getattr(first_obj, through_attr), list): - # The current part of the lookup relates to a custom Prefetch. - # This means that obj.attr is a list of related objects, and - # thus we must turn the obj.attr lists into a single related - # object list. - new_list = [] - for obj in obj_list: - new_list.extend(getattr(obj, through_attr)) - obj_list = new_list else: # Either a singly related object that has already been fetched # (e.g. via select_related), or hopefully some other property @@ -1816,7 +1807,13 @@ def prefetch_related_objects(result_cache, related_lookups): continue if new_obj is None: continue - new_obj_list.append(new_obj) + # We special-case `list` rather than something more generic + # like `Iterable` because we don't want to accidentally match + # user models that define __iter__. + if isinstance(new_obj, list): + new_obj_list.extend(new_obj) + else: + new_obj_list.append(new_obj) obj_list = new_obj_list |
