From 8533a6af8d937d487dd4a9f5c40ac98e111915a8 Mon Sep 17 00:00:00 2001 From: Mariusz Felisiak Date: Thu, 11 Aug 2022 06:54:38 +0200 Subject: [PATCH] Optimized ExclusionConstraint.validate() a bit. References to excluded fields are omitted in the replacement_map, so there is no need to replace references before checking for exclusions. --- django/contrib/postgres/constraints.py | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/django/contrib/postgres/constraints.py b/django/contrib/postgres/constraints.py index f71a587430..c67292f9f0 100644 --- a/django/contrib/postgres/constraints.py +++ b/django/contrib/postgres/constraints.py @@ -202,16 +202,15 @@ class ExclusionConstraint(BaseConstraint): for idx, (expression, operator) in enumerate(self.expressions): if isinstance(expression, str): expression = F(expression) - if isinstance(expression, F): - if exclude and expression.name in exclude: - return - rhs_expression = expression.replace_references(replacement_map) - else: - rhs_expression = expression.replace_references(replacement_map) - if exclude: - for expr in rhs_expression.flatten(): + if exclude: + if isinstance(expression, F): + if expression.name in exclude: + return + else: + for expr in expression.flatten(): if isinstance(expr, F) and expr.name in exclude: return + rhs_expression = expression.replace_references(replacement_map) # Remove OpClass because it only has sense during the constraint # creation. if isinstance(expression, OpClass):