diff options
| author | Simon Charette <charette.s@gmail.com> | 2023-05-16 15:11:19 -0400 |
|---|---|---|
| committer | Mariusz Felisiak <felisiak.mariusz@gmail.com> | 2023-05-17 08:39:44 +0200 |
| commit | 201d29b3719ef15637648be7bd947ef90a66ab55 (patch) | |
| tree | 57f798e90dcbfd8b0cdfc588a3d0c52837be33d5 /django/db/models/sql/query.py | |
| parent | 9c301814b0d342bfc5f10c1513594ce5fbb6c6a9 (diff) | |
[4.2.x] 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.
Backport of 99e5dff737cd20b12d060e4794e097063b61ec40 from main
Diffstat (limited to 'django/db/models/sql/query.py')
| -rw-r--r-- | django/db/models/sql/query.py | 10 |
1 files changed, 9 insertions, 1 deletions
diff --git a/django/db/models/sql/query.py b/django/db/models/sql/query.py index b347c6bf3f..b615d06f28 100644 --- a/django/db/models/sql/query.py +++ b/django/db/models/sql/query.py @@ -725,7 +725,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( |
