我正在将应用程序重命名为更合适的名称。为此,我想确保South正确迁移数据库(重命名数据库表并更改django_content_type或south_migrationhistory中的引用)。我知道如何migrate a model to a different app,但是当我尝试重命名应用程序本身时,South无法正确识别迁移历史记录。

不良解决方案:在将old_app重命名为new_app时,我可以保持old_app/migrations不变,并向该目录添加新迁移,以将数据库迁移为引用new_app

如果可能的话,我希望完全删除目录old_app。我还没有想到更好的解决方案。

用Django South重命名应用程序而不丢失数据的最佳方法是什么?

最佳答案

我同意拉克舍姆的观点,你应该避免这种情况。但是有时候,我们必须这样做。我过去曾遇到过这种情况,并且已经通过这种方式进行了处理。

如果要避免丢失数据,可以将旧的应用程序数据转储到json文件中。

python manage.py dumpdata old_app --natural --indent=4 1> old_app.json

请注意--natural选项,该选项将强制使用其自然键(app_name,model)导出内容类型

然后,您可以创建一个小命令来打开此json文件,并将所有old_app引用替换为new_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中更改名称。

然后,您应该删除所有向南的迁移,重新生成并为新应用应用初始迁移。然后运行SQL命令:
update django_content_type set app_label='new_app' where app_label='old_app'

然后为新应用启动向南迁移,以创建表并加载json文件。
python manage.py loaddata old_app.json

我在一个项目上做过类似的事情,看来还可以。

希望对您有所帮助

关于django - 使用Django和South重命名应用程序,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4566978/

10-12 00:26
查看更多