我想知道什么是使用Django迁移删除已移除应用的所有表的最简洁方法。例如,如果我安装了一个新软件包,我将应用程序添加到我的settings.py中,然后执行manage.py makemigrations和manage.py migrate;然后,当我决定不想使用此软件包并将其从我的settings.py中删除时,命令manage.py makemigrations将告诉我"未检测到任何更改"因此manage.py migrate将不执行任何操作,但我需要删除此删除的应用程序创建的表。
我希望Django迁移能够处理这个问题,所以如果我删除一个应用程序,它也会创建迁移以删除所有必要的表。
答案 0 :(得分:11)
你必须要小心这个,确保你理解当你这样做时正在逆转的操作,但这样的事情应该有效:
var request = require('request');
request({
method: 'POST',
url: 'http://example.com/login',
headers: {
"User-Agent": "Chocolate 2.0 XD",
},
formData: {
user_id: "some user",
password: "some pass",
storecookie: 'on',
checkerrors: 'yes'
}
},function(error, response,body){
if(error){
console.log(error);
} else if(response.statuscode !== 200) {
console.log(response.body);
}
});
显然,您必须先执行此操作,然后才能将其从设置中删除,以便可以发现迁移。
编辑:这已经慢慢收到了一些赞成票 - 我想我会引导所有人走向appropriate documentation,特别是:
使用名称零来取消应用应用的所有迁移。
答案 1 :(得分:3)
首先,在应用的models.py中注释掉所有类。然后,像往常一样创建一个新的迁移,这将删除所有应用程序的表,然后运行它。最后,从代码库中删除整个应用程序及其所有引用。
答案 2 :(得分:2)
将nachouve的答案扩展到正确的django迁移,您可以对所有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)
]