From bdf3473e64879d196e79fe8832cdacc6efb68150 Mon Sep 17 00:00:00 2001 From: Loic Bistuer Date: Mon, 19 May 2014 03:43:13 +0700 Subject: 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. --- django/db/models/query.py | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) (limited to 'django') 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 -- cgit v1.3