summaryrefslogtreecommitdiff
path: root/django
diff options
context:
space:
mode:
authorSimon Charette <charette.s@gmail.com>2023-05-16 15:11:19 -0400
committerMariusz Felisiak <felisiak.mariusz@gmail.com>2023-05-17 08:06:11 +0200
commit99e5dff737cd20b12d060e4794e097063b61ec40 (patch)
treeec5fadc1ec5d0972f879d6b22ca38a2856457aa7 /django
parent0ec60661e61b153e6bcec64649b1b7f524eb3e18 (diff)
downloaddjango-99e5dff737cd20b12d060e4794e097063b61ec40.tar.gz
Fixed #34570 -- Silenced noop deferral of many-to-many and GFK.
While deferring many-to-many and GFK has no effect, the previous implementation of QuerySet.defer() ignore them instead of crashing. Regression in b3db6c8dcb5145f7d45eff517bcd96460475c879. Thanks Paco Martínez for the report.
Diffstat (limited to 'django')
-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(