mirror of
https://github.com/django/django.git
synced 2025-10-31 09:41:08 +00:00
[5.0.x] Fixed #35638 -- Updated validate_constraints to consider db_default.
Backport of 509763c799 from main.
This commit is contained in:
committed by
Sarah Boyce
parent
e88ef6a27d
commit
333cfab512
@@ -1153,9 +1153,41 @@ class Star(Expression):
|
||||
|
||||
|
||||
class DatabaseDefault(Expression):
|
||||
"""Placeholder expression for the database default in an insert query."""
|
||||
"""
|
||||
Expression to use DEFAULT keyword during insert otherwise the underlying expression.
|
||||
"""
|
||||
|
||||
def __init__(self, expression, output_field=None):
|
||||
super().__init__(output_field)
|
||||
self.expression = expression
|
||||
|
||||
def get_source_expressions(self):
|
||||
return [self.expression]
|
||||
|
||||
def set_source_expressions(self, exprs):
|
||||
(self.expression,) = exprs
|
||||
|
||||
def resolve_expression(
|
||||
self, query=None, allow_joins=True, reuse=None, summarize=False, for_save=False
|
||||
):
|
||||
resolved_expression = self.expression.resolve_expression(
|
||||
query=query,
|
||||
allow_joins=allow_joins,
|
||||
reuse=reuse,
|
||||
summarize=summarize,
|
||||
for_save=for_save,
|
||||
)
|
||||
# Defaults used outside an INSERT context should resolve to their
|
||||
# underlying expression.
|
||||
if not for_save:
|
||||
return resolved_expression
|
||||
return DatabaseDefault(
|
||||
resolved_expression, output_field=self._output_field_or_none
|
||||
)
|
||||
|
||||
def as_sql(self, compiler, connection):
|
||||
if not connection.features.supports_default_keyword_in_insert:
|
||||
return compiler.compile(self.expression)
|
||||
return "DEFAULT", []
|
||||
|
||||
|
||||
|
||||
@@ -982,13 +982,7 @@ class Field(RegisterLookupMixin):
|
||||
|
||||
def pre_save(self, model_instance, add):
|
||||
"""Return field's value just before saving."""
|
||||
value = getattr(model_instance, self.attname)
|
||||
if not connection.features.supports_default_keyword_in_insert:
|
||||
from django.db.models.expressions import DatabaseDefault
|
||||
|
||||
if isinstance(value, DatabaseDefault):
|
||||
return self._db_default_expression
|
||||
return value
|
||||
return getattr(model_instance, self.attname)
|
||||
|
||||
def get_prep_value(self, value):
|
||||
"""Perform preliminary non-db specific value checks and conversions."""
|
||||
@@ -1030,7 +1024,9 @@ class Field(RegisterLookupMixin):
|
||||
if self.db_default is not NOT_PROVIDED:
|
||||
from django.db.models.expressions import DatabaseDefault
|
||||
|
||||
return DatabaseDefault
|
||||
return lambda: DatabaseDefault(
|
||||
self._db_default_expression, output_field=self
|
||||
)
|
||||
|
||||
if (
|
||||
not self.empty_strings_allowed
|
||||
|
||||
Reference in New Issue
Block a user