How can I skip a migration with Django migrate command?

Question:

First, I am asking about Django migration introduced in 1.7, not south.

Suppose I have migrations 001_add_field_x, 002_add_field_y, and both of them are applied to database. Now I change my mind and decide to revert the second migration and replace it with another migration 003_add_field_z.

In other words, I want to apply 001 and 003, skipping 002, how can I do this?

P.S. I know I can migrate backwards to 001, but after I make the 003 migration and execute migrate command, 001 through 003 will all be applied, right?

Asked By: NeoWang

||

Answers:

You can use the --fake option.

Once you revert to 0001 you can run

python manage.py migrate <app> 0002 --fake

and then run

python manage.py migrate <app> #Optionally specify 0003 explicitly

which would apply only 0003 in this case.

If you do not want to follow this process for all the environment/other developers, you can just remove the migration files, and run a new makemigration, and commit that file – and yes, do run migrate with the --fake option

docs: https://docs.djangoproject.com/en/3.1/ref/django-admin/#cmdoption-migrate-fake

Answered By: karthikr

Not applicable to this specific case, but if one wants or needs to skip all unapplied migrations, this can be used:

python manage.py migrate --fake

Just saves a bit of typing.

Answered By: Nagev