diff options
| author | Simon Charette <charette.s@gmail.com> | 2025-02-18 12:43:38 -0500 |
|---|---|---|
| committer | Sarah Boyce <42296566+sarahboyce@users.noreply.github.com> | 2025-08-04 09:41:29 +0200 |
| commit | e5ccb69bc3da407ab2b0477c0cc5db27c7207225 (patch) | |
| tree | a5bbe4747edc65c6c3dc056942b34c473513ee39 /django | |
| parent | 5aefd005fc3dd35be6e9e4a24f9c2bc92b69df3b (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.py | 19 |
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) |
