Por defecto, las migraciones de Django se ejecutan una sola vez. Pero a veces necesitamos volver a ejecutar una migración de Django, especialmente cuando probamos migraciones personalizadas durante el desarrollo. Esta guía te mostrará cómo hacerlo.

    1 - Vuelve a la migración inmediatamente anterior a la que quieres volver a ejecutar

    En primer lugar, imagine el historial de migración de myapp se ve así:

     $ ./manage.py showmigrations myapp myapp ... [x] 0004_the_migration_right_before [x] 0005_the_migration_i_want_to_rerun [x] 0006_a_migration_i_dont_care_about ... [x] 0010_the_latest_migration 

    Es conveniente visualizar el historial de migraciones antes de meterse con ellas. Cuando hayamos terminado con este proceso, podremos asegurarnos de que el estado final de la migración coincide con el estado original.

    Así que la última migración es 0010_la_última_migración y queremos volver a ejecutar 0005_the_migration_i_want_to_rerun .

    Utilizaremos el --fake bandera para "falsear" la migración antes de la que queremos volver a ejecutar. También tendremos que especificar la aplicación de destino para la migración, que en este caso es myapp .

     ./mange.py migrate --fake myapp 0004_the_migration_right_before 

    Tenga en cuenta que se trata de una función avanzada que modifica el estado de la migración y puede causar problemas que requieran una recuperación manual.

    2 - Vuelva a ejecutar la migración de destino

    Ahora podemos ejecutar sólo nuestro objetivo de migración:

     ./mange.py migrar myapp 0005_la_migracion_que_quiero_ejecutar 

    3 - Volver a la última migración

    Ahora, para restaurar el estado original de la migración, tenemos que falsear la última migración:

     ./mange.py migrate --fake myapp 0010_the_latest_migration 

    Podemos confirmar que nuestro historial de migración parece correcto ejecutando lo siguiente y comparándolo con el estado original:

     ./manage.py showmigrations myapp myapp ... [x] 0004_the_migration_right_before [x] 0005_the_migration_i_want_to_rerun [x] 0006_a_migration_i_dont_care_about ... [x] 0010_the_latest_migration