From 99e5dff737cd20b12d060e4794e097063b61ec40 Mon Sep 17 00:00:00 2001 From: Simon Charette Date: Tue, 16 May 2023 15:11:19 -0400 Subject: Fixed #34570 -- Silenced noop deferral of many-to-many and GFK. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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. --- django/db/models/sql/query.py | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) (limited to 'django') 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( -- cgit v1.2.1