Удалить приложение с миграциями Django 1.7

Я хотел бы знать, что самый чистый способ удалить все таблицы для удаленного приложения, используя миграции Django. Если, например, я устанавливаю новый пакет, я добавляю приложение в свой файл settings.py, и я делаю make.py makemigrations и manage.py migrate; когда я решаю, что я не хочу использовать этот пакет, и я удаляю его из моих настроек .py, команда manage.py makemigrations скажет мне, что "никаких изменений не обнаружено", и поэтому manage.py migrate ничего не сделает, но я необходимо удалить таблицы, созданные этим удаленным приложением.

Я ожидал миграции Django, чтобы обработать это, поэтому, если я удалю приложение, он также создаст миграции, чтобы удалить все необходимые таблицы.

Ответ 1

вам нужно быть осторожным с этим, убедитесь, что вы понимаете, что операции будут отменены, когда вы это сделаете, но что-то вроде этого должно работать:

manage.py migrate <app_name> zero

очевидно, вам нужно сделать это, прежде чем удалять его из своих настроек, и такие миграции могут быть обнаружены.

edit: это медленно получало несколько upvotes - я решил, что буду направлять всех к соответствующей документации, в частности:

Используйте имя ноль, чтобы удалить все миграции для приложения.

Ответ 2

Во-первых, закомментируйте все классы в вашем приложении models.py. Затем создайте новую миграцию, как обычно, которая удалит все таблицы приложений и запустит ее. Наконец, удалите все приложение и все ссылки на него из базы кода.

Ответ 3

расширяющий nachouve ответ на надлежащую миграцию django, вы можете использовать миграцию RunSQL со всеми DROP statements, см. dgango docs.

Вы можете поместить это в приложение, которое вы хотите удалить, или (если вы уже удалили приложение или его установили, чтобы вы не могли его редактировать) в другом приложении.

Например, для очистки после удаления учетных записей django-user (который имеет плохой охват и является обязательством):

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)
    ]