#36639: Add CI step to run makemigrations --check against test models -------------------------------------+------------------------------------- Reporter: Jacob Walls | Type: | Cleanup/optimization Status: new | Component: Core | (Other) Version: dev | Severity: Normal Keywords: | Triage Stage: | Unreviewed Has patch: 0 | Needs documentation: 0 Needs tests: 0 | Patch needs improvement: 0 Easy pickings: 0 | UI/UX: 0 -------------------------------------+------------------------------------- When adjusting or adding test models, it is easy to overlook adding changes to the migration files.
We could add some sort of CI check for this. We'd want a script, not changes in `django.test`, but here's a dirty version just to surface the failures. It doesn't work with the parallel runner. {{{#!diff diff --git a/django/test/testcases.py b/django/test/testcases.py index c587f770a6..b33d2cf627 100644 --- a/django/test/testcases.py +++ b/django/test/testcases.py @@ -1132,6 +1132,12 @@ class TransactionTestCase(SimpleTestCase): cls._pre_setup() cls._pre_setup_ran_eagerly = True + try: + call_command("makemigrations", "--check", verbosity=0) + except SystemExit: + call_command("makemigrations", "--check", verbosity=3) + raise + @classmethod def tearDownClass(cls): super().tearDownClass() }}} Gives as of 2514857e3fae831106832cca8823237801cf2cad: {{{#!py Migrations for 'db_functions': db_functions/migrations/0003_article_id_author_id_decimalmodel_id_dtmodel_id_and_more.py + Add field id to article + Add field id to author + Add field id to decimalmodel + Add field id to dtmodel + Add field id to fan + Add field id to floatmodel + Add field id to integermodel Full migrations file '0003_article_id_author_id_decimalmodel_id_dtmodel_id_and_more.py': # Generated by Django 6.1.dev20251003191637 on 2025-10-03 17:27 from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ ('db_functions', '0002_create_test_models'), ] operations = [ migrations.AddField( model_name='article', name='id', field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'), ), migrations.AddField( model_name='author', name='id', field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'), ), migrations.AddField( model_name='decimalmodel', name='id', field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'), ), migrations.AddField( model_name='dtmodel', name='id', field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'), ), migrations.AddField( model_name='fan', name='id', field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'), ), migrations.AddField( model_name='floatmodel', name='id', field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'), ), migrations.AddField( model_name='integermodel', name='id', field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'), ), ] Migrations for 'migration_test_data_persistence': migration_test_data_persistence/migrations/0003_unmanaged_alter_book_id.py + Create model Unmanaged ~ Alter field id on book Full migrations file '0003_unmanaged_alter_book_id.py': # Generated by Django 6.1.dev20251003191637 on 2025-10-03 17:27 from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ ('migration_test_data_persistence', '0002_add_book'), ] operations = [ migrations.CreateModel( name='Unmanaged', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('title', models.CharField(max_length=100)), ], options={ 'managed': False, }, ), migrations.AlterField( model_name='book', name='id', field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'), ), ] Migrations for 'postgres_tests': postgres_tests/migrations/0003_alter_withsizearraymodel_field.py ~ Alter field field on withsizearraymodel Full migrations file '0003_alter_withsizearraymodel_field.py': # Generated by Django 6.1.dev20251003191637 on 2025-10-03 17:27 import postgres_tests.fields from django.db import migrations class Migration(migrations.Migration): dependencies = [ ('postgres_tests', '0002_create_test_models'), ] operations = [ migrations.AlterField( model_name='withsizearraymodel', name='field', field=postgres_tests.fields.DummyArrayField(base_field='', default=None, size=1), preserve_default=False, ), ] Migrations for 'sites_framework': sites_framework/migrations/0002_alter_customarticle_managers_and_more.py ~ Change managers on customarticle ~ Change managers on exclusivearticle ~ Change managers on syndicatedarticle ~ Alter field id on customarticle ~ Alter field id on exclusivearticle ~ Alter field id on syndicatedarticle Full migrations file '0002_alter_customarticle_managers_and_more.py': # Generated by Django 6.1.dev20251003191637 on 2025-10-03 17:27 import django.contrib.sites.managers import django.db.models.manager from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ ('sites_framework', '0001_initial'), ] operations = [ migrations.AlterModelManagers( name='customarticle', managers=[ ('objects', django.db.models.manager.Manager()), ('on_site', django.contrib.sites.managers.CurrentSiteManager('places_this_article_should_appear')), ], ), migrations.AlterModelManagers( name='exclusivearticle', managers=[ ('objects', django.db.models.manager.Manager()), ('on_site', django.contrib.sites.managers.CurrentSiteManager()), ], ), migrations.AlterModelManagers( name='syndicatedarticle', managers=[ ('objects', django.db.models.manager.Manager()), ('on_site', django.contrib.sites.managers.CurrentSiteManager()), ], ), migrations.AlterField( model_name='customarticle', name='id', field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'), ), migrations.AlterField( model_name='exclusivearticle', name='id', field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'), ), migrations.AlterField( model_name='syndicatedarticle', name='id', field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'), ), ] }}} -- Ticket URL: <https://code.djangoproject.com/ticket/36639> Django <https://code.djangoproject.com/> The Web framework for perfectionists with deadlines. -- You received this message because you are subscribed to the Google Groups "Django updates" group. To unsubscribe from this group and stop receiving emails from it, send an email to django-updates+unsubscr...@googlegroups.com. To view this discussion visit https://groups.google.com/d/msgid/django-updates/01070199ac35c0c8-39347c22-1fc6-45ae-bec9-821c54222c35-000000%40eu-central-1.amazonses.com.