1
0
mirror of https://github.com/django/django.git synced 2025-10-31 09:41:08 +00:00

[4.1.x] Fixed #33902 -- Fixed Meta.constraints validation crash with F() expressions.

Thanks Adam Zahradník for the report.

Bug in 667105877e.
Backport of 63884829ac from main
This commit is contained in:
Mariusz Felisiak
2022-08-09 06:08:48 +02:00
parent 8ea203d112
commit 6b0193146d
4 changed files with 27 additions and 6 deletions

View File

@@ -326,9 +326,12 @@ class UniqueConstraint(BaseConstraint):
# Ignore constraints with excluded fields.
if exclude:
for expression in self.expressions:
for expr in expression.flatten():
if isinstance(expr, F) and expr.name in exclude:
return
if hasattr(expression, "flatten"):
for expr in expression.flatten():
if isinstance(expr, F) and expr.name in exclude:
return
elif isinstance(expression, F) and expression.name in exclude:
return
replacement_map = instance._get_field_value_map(
meta=model._meta, exclude=exclude
)

View File

@@ -393,9 +393,7 @@ class BaseExpression:
clone = self.copy()
clone.set_source_expressions(
[
references_map.get(expr.name, expr)
if isinstance(expr, F)
else expr.replace_references(references_map)
expr.replace_references(references_map)
for expr in self.get_source_expressions()
]
)
@@ -810,6 +808,9 @@ class F(Combinable):
):
return query.resolve_ref(self.name, allow_joins, reuse, summarize)
def replace_references(self, references_map):
return references_map.get(self.name, self)
def asc(self, **kwargs):
return OrderBy(self, **kwargs)