diff --git a/django/db/backends/base/schema.py b/django/db/backends/base/schema.py index 191809441a..ef859907de 100644 --- a/django/db/backends/base/schema.py +++ b/django/db/backends/base/schema.py @@ -744,9 +744,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 d58da8b7ac..57a9086c19 100644 --- a/tests/migrations/test_operations.py +++ b/tests/migrations/test_operations.py @@ -1692,15 +1692,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 20a00e29f7..72f90c934b 100644 --- a/tests/schema/tests.py +++ b/tests/schema/tests.py @@ -2257,6 +2257,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" )