gpt4 book ai didi

django - 使用 Django 和 South 重命名应用程序

转载 作者:行者123 更新时间:2023-11-28 19:36:05 25 4
gpt4 key购买 nike

我正在将应用程序重命名为更合适的名称。这样做时,我想确保 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 重命名应用程序的最佳方法是什么?

最佳答案

我同意 Laksham 的观点,您应该避免这种情况。但有时,我们不得不这样做。我过去曾遇到过这种情况,而且我是这样处理的。

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

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

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

然后您可以创建一个小命令来打开此 json 文件并将所有旧应用程序引用替换为新应用程序。

像这样的东西应该可以工作

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com