summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Sanders <shang.xiao.sanders@gmail.com>2024-08-05 08:20:48 +0200
committerSarah Boyce <42296566+sarahboyce@users.noreply.github.com>2024-08-05 17:42:19 +0200
commite88ef6a27d125da95e530be20b879fb4f540f7f6 (patch)
treefab480448dbbbc6d9e2c7454145358f8541ddc3c
parentc822ad638a746c4f2bcc2629586aca1cb03cb513 (diff)
[5.0.x] Refs #35638 -- Avoided wrapping expressions with Value in _get_field_value_map() and renamed to _get_field_expression_map().
Backport of 91a038754bb516d29cb79f0fed4025436b5c5346 from main.
-rw-r--r--django/contrib/postgres/constraints.py2
-rw-r--r--django/db/models/base.py9
-rw-r--r--django/db/models/constraints.py8
3 files changed, 13 insertions, 6 deletions
diff --git a/django/contrib/postgres/constraints.py b/django/contrib/postgres/constraints.py
index c61072b5a5..031952bfdb 100644
--- a/django/contrib/postgres/constraints.py
+++ b/django/contrib/postgres/constraints.py
@@ -183,7 +183,7 @@ class ExclusionConstraint(BaseConstraint):
def validate(self, model, instance, exclude=None, using=DEFAULT_DB_ALIAS):
queryset = model._default_manager.using(using)
- replacement_map = instance._get_field_value_map(
+ replacement_map = instance._get_field_expression_map(
meta=model._meta, exclude=exclude
)
replacements = {F(field): value for field, value in replacement_map.items()}
diff --git a/django/db/models/base.py b/django/db/models/base.py
index 876a96c5a7..9119c0f45f 100644
--- a/django/db/models/base.py
+++ b/django/db/models/base.py
@@ -1244,12 +1244,17 @@ class Model(AltersData, metaclass=ModelBase):
setattr(self, cachename, obj)
return getattr(self, cachename)
- def _get_field_value_map(self, meta, exclude=None):
+ def _get_field_expression_map(self, meta, exclude=None):
if exclude is None:
exclude = set()
meta = meta or self._meta
field_map = {
- field.name: Value(getattr(self, field.attname), field)
+ field.name: (
+ value
+ if (value := getattr(self, field.attname))
+ and hasattr(value, "resolve_expression")
+ else Value(value, field)
+ )
for field in meta.local_concrete_fields
if field.name not in exclude and not field.generated
}
diff --git a/django/db/models/constraints.py b/django/db/models/constraints.py
index ca9eef920b..cf7a65216f 100644
--- a/django/db/models/constraints.py
+++ b/django/db/models/constraints.py
@@ -124,7 +124,7 @@ class CheckConstraint(BaseConstraint):
return schema_editor._delete_check_sql(model, self.name)
def validate(self, model, instance, exclude=None, using=DEFAULT_DB_ALIAS):
- against = instance._get_field_value_map(meta=model._meta, exclude=exclude)
+ against = instance._get_field_expression_map(meta=model._meta, exclude=exclude)
try:
if not Q(self.check).check(against, using=using):
raise ValidationError(
@@ -423,7 +423,7 @@ class UniqueConstraint(BaseConstraint):
return
replacements = {
F(field): value
- for field, value in instance._get_field_value_map(
+ for field, value in instance._get_field_expression_map(
meta=model._meta, exclude=exclude
).items()
}
@@ -454,7 +454,9 @@ class UniqueConstraint(BaseConstraint):
code=self.violation_error_code,
)
else:
- against = instance._get_field_value_map(meta=model._meta, exclude=exclude)
+ against = instance._get_field_expression_map(
+ meta=model._meta, exclude=exclude
+ )
try:
if (self.condition & Exists(queryset.filter(self.condition))).check(
against, using=using