Skip to content

Commit

Permalink
Fixed #34946 -- Preserved db_default on combined default field addition.
Browse files Browse the repository at this point in the history
Regression in 7414704.
  • Loading branch information
charettes authored Nov 7, 2023
1 parent 656192c commit 8a28e98
Show file tree
Hide file tree
Showing 3 changed files with 29 additions and 5 deletions.
4 changes: 2 additions & 2 deletions django/db/backends/base/schema.py
Original file line number Diff line number Diff line change
Expand Up @@ -744,9 +744,9 @@ def add_field(self, model, field):
}
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(
Expand Down
13 changes: 10 additions & 3 deletions tests/migrations/test_operations.py
Original file line number Diff line number Diff line change
Expand Up @@ -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()
Expand Down
17 changes: 17 additions & 0 deletions tests/schema/tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -2257,6 +2257,23 @@ 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"

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"
)
Expand Down

0 comments on commit 8a28e98

Please sign in to comment.