summaryrefslogtreecommitdiff
path: root/django/db
diff options
context:
space:
mode:
authorLoic Bistuer <loic.bistuer@gmail.com>2014-05-19 03:43:13 +0700
committerLoic Bistuer <loic.bistuer@gmail.com>2014-05-21 10:26:04 +0700
commitbdf3473e64879d196e79fe8832cdacc6efb68150 (patch)
treebde9f2c796280e89fbef915a1389295d8d43bed0 /django/db
parent8a95b4fca793eeb8adceffe697b55214509019eb (diff)
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.
Diffstat (limited to 'django/db')
-rw-r--r--django/db/models/query.py17
1 files changed, 7 insertions, 10 deletions
diff --git a/django/db/models/query.py b/django/db/models/query.py
index 7fedc3f74b..53f87e80e5 100644
--- a/django/db/models/query.py
+++ b/django/db/models/query.py
@@ -1790,15 +1790,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
@@ -1815,7 +1806,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