我想知道什么是使用Django迁移删除所删除应用程序的所有表的最简洁方法。例如,如果我安装了一个新软件包,我将应用程序添加到我的settings.py中,然后执行manage.py makemigrations和manage.py migrate;当我决定我不想使用这个包并从settings.py中删除它时,命令manage.py makemigrations会告诉我“没有检测到任何变化”,所以manage.py migrate将什么都不做,但是我需要删除此删除的应用程序创建的表。
我期望Django迁移处理这个,所以如果我删除一个应用程序,它也会创建迁移以删除所有必要的表。
你必须要小心这个,确保你理解当你这样做时正在逆转的操作,但这样的事情应该有效:
manage.py migrate <app_name> zero
显然,在将其从设置中删除之前必须执行此操作,因此可以发现迁移。
编辑:这已经慢慢收到了一些赞成票 - 我想我会引导所有人走向 适当的文件, 尤其是:
使用名称零可以取消应用应用的所有迁移。
首先,注释掉应用程序的models.py中的所有类。然后,像往常一样创建一个新的迁移,这将删除所有应用程序的表,然后运行它。最后,从代码库中删除整个应用程序及其所有引用。
将nachouve的答案扩展到适当的django迁移,你可以使用a RunSQL
全部迁移 DROP statements
,请参阅django迁移文档。
你可以把它放在你要删除的应用程序中,或者(如果你已经删除了应用程序,或者它已经安装好,你就无法编辑它)在另一个应用程序中。
例如,在删除django-user-accounts(覆盖范围很差并且是负债)后进行清理:
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)
]