diff options
| author | Simon Charette <charette.s@gmail.com> | 2023-11-07 05:32:34 -0500 |
|---|---|---|
| committer | Mariusz Felisiak <felisiak.mariusz@gmail.com> | 2023-11-07 13:33:24 +0300 |
| commit | 0265eaa500aa01e5328989b5cd814db7234f3777 (patch) | |
| tree | ea31869552e640644787f8bd844aa3ecee686304 | |
| parent | 1383dc75eb8171c43ef6a19cac3b9f57f549ccc4 (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.py | 4 | ||||
| -rw-r--r-- | tests/migrations/test_operations.py | 13 | ||||
| -rw-r--r-- | tests/schema/tests.py | 17 |
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" ) |
