使用Django 1.7迁移删除应用程序

使用Django 1.7迁移删除应用程序,django,django-migrations,Django,Django Migrations,我想知道使用Django迁移删除已删除应用程序的所有表的最干净方法是什么。例如,如果我安装了一个新软件包,我会将该应用程序添加到我的settings.py,然后执行manage.py makemigrations和manage.py migrate;当我决定不使用此软件包并将其从我的settings.py中删除时,命令manage.py makemigrations将告诉我“未检测到任何更改”,因此manage.py migrate将不起任何作用,但我需要删除此已删除应用程序创建的表 我希望Dj

我想知道使用Django迁移删除已删除应用程序的所有表的最干净方法是什么。例如,如果我安装了一个新软件包,我会将该应用程序添加到我的settings.py,然后执行manage.py makemigrations和manage.py migrate;当我决定不使用此软件包并将其从我的settings.py中删除时,命令manage.py makemigrations将告诉我“未检测到任何更改”,因此manage.py migrate将不起任何作用,但我需要删除此已删除应用程序创建的表


我希望Django迁移能够处理这个问题,因此如果我删除一个应用程序,它也会创建迁移来删除所有必需的表。

首先,注释掉应用程序models.py中的所有类。然后,像往常一样创建一个新的迁移,它将删除所有应用程序的表,并运行它。最后,从代码库中删除整个应用程序及其所有引用。

将nachouve的答案扩展为正确的django迁移,您可以使用带有所有
DROP语句的
RunSQL
迁移,请参阅django迁移文档

您可以将其放在即将删除的应用程序中,或者(如果您已经删除了该应用程序,或者该应用程序已安装,因此无法编辑)放在其他应用程序中

例如,要在删除django用户帐户后进行清理(该帐户的覆盖率很低,是一种负担):

从django.db导入迁移
DROP_ACCOUNT_TABLES=“”“\
如果存在账户\账户级联,则删除表;
如果存在帐户,则删除表\u AccountDelete级联;
如果存在帐户\电子邮件地址级联,则删除表;
如果存在帐户,则删除表\u电子邮件确认级联;
如果存在帐户\注册码级联,则删除表;
删除表(如果存在)帐户\注册码结果级联;
"""
类迁移(migrations.Migration):
依赖项=[
('auth','>'),
]
操作=[
RunSQL(DROP\u ACCOUNT\u表)
]

您必须小心这一点,确保在执行此操作时理解正在反转的操作,但类似的操作应该可以:

manage.py迁移,特别是:

使用名称零取消应用程序的所有迁移


为什么不先删除应用程序的所有迁移,然后再删除应用程序?我更改了问题,我解释错了,我希望现在它更清楚!你找到解决办法了吗?这似乎是一个很好的解决方案,但当应用程序集成到我的项目中时更有意义,在这种情况下,我只是在我的virtualenv中安装一个软件包,并将其链接到我的项目,然后将其添加到my settings.py。我是Django的新手,所以这可能是我还没有得到的一些愚蠢的东西!要删除整个应用程序,可以使用“python manage.py migrate[app_name]zero”这是我最喜欢的解决方案,但如果在其他应用程序上,您的模型中有要删除的应用程序中模型的外键,则该解决方案仍然不起作用。您将得到一个NodeNotFoundError:
django.db.migrations.exceptions.NodeNotFoundError:Migration other_app.0001_初始依赖项引用不存在的父节点(app_to_be_remove',u'0001_initial')
。有没有办法避免这种情况?
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)
    ]