diff --git a/django/db/backends/base/schema.py b/django/db/backends/base/schema.py index 5e111aed73..09785e8586 100644 --- a/django/db/backends/base/schema.py +++ b/django/db/backends/base/schema.py @@ -637,6 +637,8 @@ class BaseDatabaseSchemaEditor: # It might not actually have a column behind it if definition is None: return + if col_type_suffix := field.db_type_suffix(connection=self.connection): + definition += f" {col_type_suffix}" # Check constraints can go on the column SQL here db_params = field.db_parameters(connection=self.connection) if db_params["check"]: diff --git a/docs/releases/4.1.1.txt b/docs/releases/4.1.1.txt index 55c0b7ed08..22b9be5bf7 100644 --- a/docs/releases/4.1.1.txt +++ b/docs/releases/4.1.1.txt @@ -35,3 +35,7 @@ Bugfixes * Fixed a bug in Django 4.1 that caused an incorrect validation of ``CheckConstraint()`` with range fields on PostgreSQL (:ticket:`33905`). + +* Fixed a regression in Django 4.1 that caused an incorrect migration when + adding ``AutoField``, ``BigAutoField``, or ``SmallAutoField`` on PostgreSQL + (:ticket:`33919`). diff --git a/tests/schema/tests.py b/tests/schema/tests.py index a72e6906bb..6fe35e7109 100644 --- a/tests/schema/tests.py +++ b/tests/schema/tests.py @@ -795,6 +795,31 @@ class SchemaTests(TransactionTestCase): # Introspection treats BLOBs as TextFields self.assertEqual(columns["bits"][0], "TextField") + @isolate_apps("schema") + def test_add_auto_field(self): + class AddAutoFieldModel(Model): + name = CharField(max_length=255, primary_key=True) + + class Meta: + app_label = "schema" + + with connection.schema_editor() as editor: + editor.create_model(AddAutoFieldModel) + self.isolated_local_models = [AddAutoFieldModel] + old_field = AddAutoFieldModel._meta.get_field("name") + new_field = CharField(max_length=255) + new_field.set_attributes_from_name("name") + new_field.model = AddAutoFieldModel + with connection.schema_editor() as editor: + editor.alter_field(AddAutoFieldModel, old_field, new_field) + new_auto_field = AutoField(primary_key=True) + new_auto_field.set_attributes_from_name("id") + new_auto_field.model = AddAutoFieldModel() + with connection.schema_editor() as editor: + editor.add_field(AddAutoFieldModel, new_auto_field) + # Crashes on PostgreSQL when the GENERATED BY suffix is missing. + AddAutoFieldModel.objects.create(name="test") + def test_remove_field(self): with connection.schema_editor() as editor: editor.create_model(Author)