summaryrefslogtreecommitdiff
path: root/django/db
diff options
context:
space:
mode:
authorSimon Charette <charette.s@gmail.com>2016-07-19 14:55:59 -0400
committerSimon Charette <charette.s@gmail.com>2016-07-19 16:09:23 -0400
commitdcf0a35b088ba9ce8907d8f34178bd6dffc27022 (patch)
tree1bb10b6d6877582cbd2f5dcb3e47f68a7b1f1693 /django/db
parent53d17f9e75e5abffa43c2fbed929f703d3f0e7e8 (diff)
[1.10.x] Fixed #26916 -- Fixed prefetch_related when using a cached_property as to_attr.
Thanks Trac alias karyon for the report and Tim for the review. Backport of 271bfe65d986f5ecbaeb7a70a3092356c0a9e222 from master
Diffstat (limited to 'django/db')
-rw-r--r--django/db/models/query.py9
1 files changed, 7 insertions, 2 deletions
diff --git a/django/db/models/query.py b/django/db/models/query.py
index 2f4ef52e6c..fe84a9ef34 100644
--- a/django/db/models/query.py
+++ b/django/db/models/query.py
@@ -25,7 +25,7 @@ from django.db.models.query_utils import (
from django.db.models.sql.constants import CURSOR
from django.utils import six, timezone
from django.utils.deprecation import RemovedInDjango20Warning
-from django.utils.functional import partition
+from django.utils.functional import cached_property, partition
from django.utils.version import get_version
# The maximum number of items to display in a QuerySet.__repr__
@@ -1541,7 +1541,12 @@ def get_prefetcher(instance, through_attr, to_attr):
if hasattr(rel_obj, 'get_prefetch_queryset'):
prefetcher = rel_obj
if through_attr != to_attr:
- is_fetched = hasattr(instance, to_attr)
+ # Special case cached_property instances because hasattr
+ # triggers attribute computation and assignment.
+ if isinstance(getattr(instance.__class__, to_attr, None), cached_property):
+ is_fetched = to_attr in instance.__dict__
+ else:
+ is_fetched = hasattr(instance, to_attr)
else:
is_fetched = through_attr in instance._prefetched_objects_cache
return prefetcher, rel_obj_descriptor, attr_found, is_fetched