summaryrefslogtreecommitdiff
path: root/django/db/models/sql/compiler.py
diff options
context:
space:
mode:
authorSimon Charette <charette.s@gmail.com>2024-04-05 23:08:49 -0400
committernessita <124304+nessita@users.noreply.github.com>2024-04-23 13:17:17 -0300
commit83f5478225588f31e7cbbfed63a4a2b936abc03f (patch)
tree8024a1a6871b67d16f5ba8df3ecd435f5e48afce /django/db/models/sql/compiler.py
parentbcad5ad92b1dad2874453dee7a480e9b9f29aad5 (diff)
Fixed #35356 -- Deferred self-referential foreign key fields adequately.
While refs #34612 surfaced issues with reverse one-to-one fields deferrals, it missed that switching to storing remote fields would break self-referential relationships. This change switches to storing related objects in the select mask instead of remote fields to prevent collisions when dealing with self-referential relationships that might have a different directional mask. Despite fixing #21204 introduced a crash under some self-referential deferral conditions, it was simply not working even before that as it aggregated the sets of deferred fields by model. Thanks Joshua van Besouw for the report and Mariusz Felisiak for the review.
Diffstat (limited to 'django/db/models/sql/compiler.py')
-rw-r--r--django/db/models/sql/compiler.py8
1 files changed, 4 insertions, 4 deletions
diff --git a/django/db/models/sql/compiler.py b/django/db/models/sql/compiler.py
index 676625df6f..7541817ba0 100644
--- a/django/db/models/sql/compiler.py
+++ b/django/db/models/sql/compiler.py
@@ -1253,21 +1253,21 @@ class SQLCompiler:
if restricted:
related_fields = [
- (o.field, o.related_model)
+ (o, o.field, o.related_model)
for o in opts.related_objects
if o.field.unique and not o.many_to_many
]
- for related_field, model in related_fields:
- related_select_mask = select_mask.get(related_field) or {}
+ for related_object, related_field, model in related_fields:
if not select_related_descend(
related_field,
restricted,
requested,
- related_select_mask,
+ select_mask,
reverse=True,
):
continue
+ related_select_mask = select_mask.get(related_object) or {}
related_field_name = related_field.related_query_name()
fields_found.add(related_field_name)