summaryrefslogtreecommitdiff
path: root/django/db/models/sql/query.py
diff options
context:
space:
mode:
Diffstat (limited to 'django/db/models/sql/query.py')
-rw-r--r--django/db/models/sql/query.py10
1 files changed, 9 insertions, 1 deletions
diff --git a/django/db/models/sql/query.py b/django/db/models/sql/query.py
index c8f849daea..252e5e9fcc 100644
--- a/django/db/models/sql/query.py
+++ b/django/db/models/sql/query.py
@@ -738,7 +738,15 @@ class Query(BaseExpression):
field_select_mask = select_mask.setdefault((field_name, relation), {})
field = relation.field
else:
- field = opts.get_field(field_name).field
+ reverse_rel = opts.get_field(field_name)
+ # While virtual fields such as many-to-many and generic foreign
+ # keys cannot be effectively deferred we've historically
+ # allowed them to be passed to QuerySet.defer(). Ignore such
+ # field references until a layer of validation at mask
+ # alteration time will be implemented eventually.
+ if not hasattr(reverse_rel, "field"):
+ continue
+ field = reverse_rel.field
field_select_mask = select_mask.setdefault(field, {})
related_model = field.model._meta.concrete_model
self._get_defer_select_mask(