summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSimon Charette <charette.s@gmail.com>2023-11-07 05:32:34 -0500
committerMariusz Felisiak <felisiak.mariusz@gmail.com>2023-11-07 13:33:24 +0300
commit0265eaa500aa01e5328989b5cd814db7234f3777 (patch)
treeea31869552e640644787f8bd844aa3ecee686304
parent1383dc75eb8171c43ef6a19cac3b9f57f549ccc4 (diff)
[5.0.x] Fixed #34946 -- Preserved db_default on combined default field addition.
Regression in 7414704e88d73dafbcfbb85f9bc54cb6111439d3. Backport of 8a28e983df091d94eaba77cb82fbe3ef60a80799 from main
-rw-r--r--django/db/backends/base/schema.py4
-rw-r--r--tests/migrations/test_operations.py13
-rw-r--r--tests/schema/tests.py17
3 files changed, 29 insertions, 5 deletions
diff --git a/django/db/backends/base/schema.py b/django/db/backends/base/schema.py
index 493a47548a..9c61b1ff17 100644
--- a/django/db/backends/base/schema.py
+++ b/django/db/backends/base/schema.py
@@ -745,9 +745,9 @@ class BaseDatabaseSchemaEditor:
}
self.execute(sql, params)
# Drop the default if we need to
- # (Django usually does not use in-database defaults)
if (
- not self.skip_default_on_alter(field)
+ field.db_default is NOT_PROVIDED
+ and not self.skip_default_on_alter(field)
and self.effective_default(field) is not None
):
changes_sql, params = self._alter_column_default_sql(
diff --git a/tests/migrations/test_operations.py b/tests/migrations/test_operations.py
index 01197d5fc8..71d45b8601 100644
--- a/tests/migrations/test_operations.py
+++ b/tests/migrations/test_operations.py
@@ -1693,15 +1693,22 @@ class OperationTests(OperationTestBase):
field = new_state.models[app_label, "pony"].fields["height"]
self.assertEqual(field.default, 3)
self.assertEqual(field.db_default, Value(4))
- project_state.apps.get_model(app_label, "pony").objects.create(weight=4)
+ pre_pony_pk = (
+ project_state.apps.get_model(app_label, "pony").objects.create(weight=4).pk
+ )
self.assertColumnNotExists(table_name, "height")
# Add field.
with connection.schema_editor() as editor:
operation.database_forwards(app_label, editor, project_state, new_state)
self.assertColumnExists(table_name, "height")
+ post_pony_pk = (
+ project_state.apps.get_model(app_label, "pony").objects.create(weight=10).pk
+ )
new_model = new_state.apps.get_model(app_label, "pony")
- old_pony = new_model.objects.get()
- self.assertEqual(old_pony.height, 4)
+ pre_pony = new_model.objects.get(pk=pre_pony_pk)
+ self.assertEqual(pre_pony.height, 4)
+ post_pony = new_model.objects.get(pk=post_pony_pk)
+ self.assertEqual(post_pony.height, 4)
new_pony = new_model.objects.create(weight=5)
if not connection.features.can_return_columns_from_insert:
new_pony.refresh_from_db()
diff --git a/tests/schema/tests.py b/tests/schema/tests.py
index 87cabe4cad..e1e3c7d3c6 100644
--- a/tests/schema/tests.py
+++ b/tests/schema/tests.py
@@ -2263,6 +2263,23 @@ class SchemaTests(TransactionTestCase):
columns = self.column_classes(AuthorDbDefault)
self.assertEqual(columns["renamed_year"][1].default, "1985")
+ @isolate_apps("schema")
+ def test_add_field_both_defaults_preserves_db_default(self):
+ class Author(Model):
+ class Meta:
+ app_label = "schema"
+
+ with connection.schema_editor() as editor:
+ editor.create_model(Author)
+
+ field = IntegerField(default=1985, db_default=1988)
+ field.set_attributes_from_name("birth_year")
+ field.model = Author
+ with connection.schema_editor() as editor:
+ editor.add_field(Author, field)
+ columns = self.column_classes(Author)
+ self.assertEqual(columns["birth_year"][1].default, "1988")
+
@skipUnlessDBFeature(
"supports_column_check_constraints", "can_introspect_check_constraints"
)