我正在将应用程序重命名为更合适的名称.在这样做时,我希望确保South正确迁移数据库(重命名数据库表并更改django_content_type或South_MigrationHistory中的引用).我知道如何使用migrate a model to a different app,但当我try 重命名应用程序本身时,South无法正确识别迁移历史.

Undesirable solution:在将old_app重命名为new_app时,我可以保持old_app/migrations不变,并向此目录添加新的迁移,以将数据库迁移到引用new_app.

如果可能的话,我宁愿完全删除目录old_app.我还没有想出更好的办法来解决这个问题.

在不丢失数据的情况下使用Django South重命名应用程序的最佳方式是什么?

推荐答案

我同意拉克沙姆的观点,你应该避免这种情况.但有时,我们不得不这么做.我过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

我在一个项目上做过类似的事情,看起来效果不错.

我希望有帮助

Django相关问答推荐

与django相关的预取n +1问题.我该怎么解决呢?

如何在创建对象后立即运行一次代码?

Django:作为模型中的列表元素的字段

带有变量键的 Django 模板括号表示法不起作用

如何在Django REST框架中实现ForeignKey搜索

情节主题更改问题

如何使用来自另一个字段的信息创建字段

如何在两个字段上查找 django 模型的副本?

Django Inline Tabular admin:删除一个不工作的对象

如何将 ManyToManyField 与另一个 ManyToManyField 进行比较

Django ORM 和锁定表

Django - 站点匹配查询不存在

为 Django 模型生成非顺序 ID/PK

如何在不使用 sudo 的情况下安装 virtualenv?

Django Facebook Connect 应用推荐

如何在 django 元素中开始做 TDD?

Django - 每 x 秒运行一个函数

获取 django 应用的绝对路径

如何使用查询参数构造 Django 反向/url?

如何更改模型标签并给它一个自定义名称