diff --git a/django/db/migrations/autodetector.py b/django/db/migrations/autodetector.py index 3475823003..934dab20f0 100644 --- a/django/db/migrations/autodetector.py +++ b/django/db/migrations/autodetector.py @@ -1132,6 +1132,7 @@ class MigrationAutodetector: # You can't just add NOT NULL fields with no default or fields # which don't allow empty strings as default. time_fields = (models.DateField, models.DateTimeField, models.TimeField) + auto_fields = (models.AutoField, models.SmallAutoField, models.BigAutoField) preserve_default = ( field.null or field.has_default() @@ -1139,6 +1140,7 @@ class MigrationAutodetector: or field.many_to_many or (field.blank and field.empty_strings_allowed) or (isinstance(field, time_fields) and field.auto_now) + or (isinstance(field, auto_fields)) ) if not preserve_default: field = field.clone() diff --git a/tests/migrations/test_autodetector.py b/tests/migrations/test_autodetector.py index 33196ea6f4..ac725d317e 100644 --- a/tests/migrations/test_autodetector.py +++ b/tests/migrations/test_autodetector.py @@ -1595,6 +1595,34 @@ class AutodetectorTests(BaseAutodetectorTests): changes, "testapp", 0, 0, db_default="Ada Lovelace" ) + @mock.patch( + "django.db.migrations.questioner.MigrationQuestioner.ask_not_null_addition" + ) + def test_add_auto_field_does_not_request_default(self, mocked_ask_method): + initial_state = ModelState( + "testapp", + "Author", + [ + ("pkfield", models.IntegerField(primary_key=True)), + ], + ) + for auto_field in [ + models.AutoField, + models.BigAutoField, + models.SmallAutoField, + ]: + with self.subTest(auto_field=auto_field): + updated_state = ModelState( + "testapp", + "Author", + [ + ("id", auto_field(primary_key=True)), + ("pkfield", models.IntegerField(primary_key=False)), + ], + ) + self.get_changes([initial_state], [updated_state]) + mocked_ask_method.assert_not_called() + @mock.patch( "django.db.migrations.questioner.MigrationQuestioner.ask_not_null_alteration", return_value=models.NOT_PROVIDED,