﻿id	summary	reporter	owner	description	type	status	component	version	severity	resolution	keywords	cc	stage	has_patch	needs_docs	needs_tests	needs_better_patch	easy	ui_ux
34946	Adding a field with default and db_default drops database level DEFAULT	Simon Charette	Simon Charette	"[https://docs.djangoproject.com/en/dev/ref/models/fields/#db-default The documentation] for `Field.db_default` states

> If both `db_default` and `Field.default` are set, `default` will take precedence when creating instances in Python code. `db_default` will still be set at the database level and will be used when inserting rows outside of the ORM or when adding a new field in a migration.

However adding a field with both results in the following SQL

{{{#!sql
ALTER TABLE ""foo"" ADD COLUMN ""bar"" integer DEFAULT 42 NOT NULL;
ALTER TABLE ""foo"" ALTER COLUMN ""bar"" DROP DEFAULT;
}}}

The `DEFAULT` should never be dropped if the field has a `db_default` defined.

The following patch reproduces and demonstrate [https://github.com/django/django/commit/7414704e88d73dafbcfbb85f9bc54cb6111439d3#diff-7cc40f1cb85a8f19c80b2e901626d78e4729047dbbb0ed52861f5894ff688115R1673-R1716 why the test] that intended to cover this case didn't catch it.

{{{#!diff
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 @@ def test_add_field_both_defaults(self):
         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..80fdead190 100644
--- a/tests/schema/tests.py
+++ b/tests/schema/tests.py
@@ -2257,6 +2257,24 @@ class Meta:
         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""
+
+        #self.isolated_local_models = [Author]
+        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""
     )
}}}"	Bug	closed	Migrations	5.0	Release blocker	fixed	sql, default, migrations	Paolo Melchiorre	Accepted	1	0	0	0	0	0
