summaryrefslogtreecommitdiff
path: root/django
diff options
context:
space:
mode:
authorSimon Charette <charette.s@gmail.com>2025-02-18 12:43:38 -0500
committerSarah Boyce <42296566+sarahboyce@users.noreply.github.com>2025-08-04 09:41:29 +0200
commite5ccb69bc3da407ab2b0477c0cc5db27c7207225 (patch)
treea5bbe4747edc65c6c3dc056942b34c473513ee39 /django
parent5aefd005fc3dd35be6e9e4a24f9c2bc92b69df3b (diff)
[5.2.x] Fixed #36198 -- Implemented unresolved transform expression replacement.
This allows the proper resolving of F("field__transform") when performing constraint validation. Thanks Tom Hall for the report and Sarah for the test. Prerequisite for #36518. Backport of fc303551077c3e023fe4f9d01fc1b3026c816fa4 from main.
Diffstat (limited to 'django')
-rw-r--r--django/db/models/expressions.py19
1 files changed, 18 insertions, 1 deletions
diff --git a/django/db/models/expressions.py b/django/db/models/expressions.py
index b214be7fa5..3e1bcdbd2b 100644
--- a/django/db/models/expressions.py
+++ b/django/db/models/expressions.py
@@ -902,7 +902,24 @@ class F(Combinable):
return query.resolve_ref(self.name, allow_joins, reuse, summarize)
def replace_expressions(self, replacements):
- return replacements.get(self, self)
+ if (replacement := replacements.get(self)) is not None:
+ return replacement
+ field_name, *transforms = self.name.split(LOOKUP_SEP)
+ # Avoid unnecessarily looking up replacements with field_name again as
+ # in the vast majority of cases F instances won't be composed of any
+ # lookups.
+ if not transforms:
+ return self
+ if (
+ replacement := replacements.get(F(field_name))
+ ) is None or replacement._output_field_or_none is None:
+ return self
+ for transform in transforms:
+ transform_class = replacement.get_transform(transform)
+ if transform_class is None:
+ return self
+ replacement = transform_class(replacement)
+ return replacement
def asc(self, **kwargs):
return OrderBy(self, **kwargs)