diff options
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 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( |