When adding or altering model schemas in Django, developers typically generate and commit accompanying migration files. But, counterintuitively, Django wants to track all model changes in migration files, even if they don’t result in database schema changes. Those can be easy to miss.
Regardless the reason, you never want your repo to be in a state where migrations are detected as needed, but accompanying migration files aren’t committed.
Writing a pytest test that can be triggered on github, Circle, Travis, Jenkins, or whatever you use turns out to be trivial, but I couldn’t find documentation or examples on the interwebs, so am posting this here for posterity:
import pytest from django.core.management import call_command @pytest.mark.django_db def test_for_missing_migrations(): """ If no migrations are detected as needed, `result` will be `None`. In all other cases, the call will fail, alerting your team that someone is trying to make a change that requires a migration and that migration is absent. """ result = call_command("makemigrations", check=True, dry_run=True) assert not result
It really is that simple! If no migrations are needed,
result will be
None. Any other return value means someone should run
./manage.py makemigrations to see what’s missing, and commit the results.