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:26:04 +0700 |
| commit | bdf3473e64879d196e79fe8832cdacc6efb68150 (patch) | |
| tree | bde9f2c796280e89fbef915a1389295d8d43bed0 /django/db | |
| parent | 8a95b4fca793eeb8adceffe697b55214509019eb (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.py | 17 |
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 |
