我同意拉克沙姆的观点,你应该避免这种情况.但有时,我们不得不这么做.我过go 曾面对过这种情况,我以这种方式成功地做到了这一点.
如果希望避免丢失数据,可以将旧的应用程序数据转储到一个json文件中.
python manage.py dumpdata old_app --natural --indent=4 1> old_app.json
请注意--Natural选项,该选项将强制内容类型与其自然键(APP_NAME,MODEL)一起导出
然后,您可以创建一个小命令来打开这个json文件,并用new_app替换所有old_app引用.
这样的办法应该行得通
class Command(BaseCommand):
help = u"Rename app in json dump"
def handle(self, *args, **options):
try:
old_app = args[0]
new_app = args[1]
filename = args[2]
except IndexError:
print u'usage :', __name__.split('.')[-1], 'old_app new_app dumpfile.json'
return
try:
dump_file = open(filename, 'r')
except IOError:
print filename, u"doesn't exist"
return
objects = json.loads(dump_file.read())
dump_file.close()
for obj in objects:
obj["model"] = obj["model"].replace(old_app, new_app, 1)
if obj["fields"].has_key("content_type") and (old_app == obj["fields"]["content_type"][0]):
obj["fields"]["content_type"][0] = new_app
dump_file = open(filename, 'w')
dump_file.write(json.dumps(objects, indent=4))
dump_file.close()
然后重命名应用程序,更改Installed_apps中的名称.
然后,您应该删除所有向南迁移,重新生成并应用新应用程序的初始migrations.然后运行SQL命令:
update django_content_type set app_label='new_app' where app_label='old_app'
然后为新应用启动一个south migrate,以创建表并加载json文件.
python manage.py loaddata old_app.json
我在一个项目上做过类似的事情,看起来效果不错.
我希望有帮助