Me gustaría saber cuál es la forma más limpia de eliminar todas las tablas de una aplicación eliminada mediante migraciones de Django. Si, por ejemplo, instalo un paquete nuevo, agrego la aplicación a mi settings.py y hago una migración de manage.py y una migración de manage.py; cuando decido que no quiero usar este paquete y lo elimino de mi settings.py, el comando manage.py makemigrations me dirá "no se detectaron cambios" y, por lo tanto, manage.py migrate no hará nada, pero yo necesita eliminar las tablas que esta aplicación eliminada había creado.

Esperaba que las migraciones de Django manejaran esto, así que si elimino una aplicación, también crearía migraciones para eliminar todas las tablas necesarias.

respuesta

tendría que tener cuidado con este, asegúrese de comprender las operaciones que se invierten cuando lo hace, pero algo como esto debería funcionar:

manage.py migrate <app_name> zero

obviamente, debe hacer esto antes de eliminarlo de su configuración para que las migraciones sean detectables.

editar : esto ha estado recibiendo lentamente algunos votos positivos; pensé que dirigiría a todos hacia la documentación adecuada , en particular:

Use the name zero to unapply all migrations for an app.

Primero, comente todas las clases en el archivo models.py de su aplicación. Luego, cree una nueva migración como lo haría normalmente, que eliminará todas las tablas de la aplicación y la ejecutará. Finalmente, elimine toda la aplicación y todas las referencias a ella de su base de código.

extendiendo la respuesta de nachouve a una migración de django adecuada, puede usar una RunSQLmigración con todos los DROP statements, consulte los documentos de migración de django.

Puede poner esto en la aplicación que está a punto de eliminar o (si ya eliminó la aplicación o está instalada y no puede editarla) en una aplicación diferente.

Por ejemplo, para limpiar después de eliminar django-user-accounts (que tiene poca cobertura y es una responsabilidad):

from django.db import migrations

DROP_ACCOUNT_TABLES = """\
    DROP TABLE IF EXISTS account_account CASCADE;
    DROP TABLE IF EXISTS account_accountdeletion CASCADE;
    DROP TABLE IF EXISTS account_emailaddress CASCADE;
    DROP TABLE IF EXISTS account_emailconfirmation CASCADE;
    DROP TABLE IF EXISTS account_signupcode CASCADE;
    DROP TABLE IF EXISTS account_signupcoderesult CASCADE;
"""


class Migration(migrations.Migration):

    dependencies = [
        ('auth', '<< previous migations >>'),
    ]

    operations = [
        migrations.RunSQL(DROP_ACCOUNT_TABLES)
    ]