2017-07-06 46 views
1

我有模型和迁移文件的名为“app1”的django应用程序。 我将此应用重命名为“app2”,并且我修复了所有导入,网址... 但我在迁移文件和表中的数据时遇到问题。 我如何写用正确的方式迁移,以确保: - 新安装=>创建新表 - 更新旧版本=>创建新表,将数据移动,删除旧表Django重命名应用程序和迁移

PS:有几个表与许多FK。

这里是我的进步,我不知道如果我的好办法: - 所有旧的迁移删除 - makemigrations产生新的迁移文件

后这2步我可以安装我的应用程序,但旧版本仍然存在问题。

问题:什么是迁移数据的最佳方式? PS:我不使用南方。我不会使用南方。

回答

1

我发现这是一个解决方案工作

1-修复老移民与新FK和新的应用程序依赖

2-力老迁移创建与旧应用程序的名称表,因此该旅店migrations.CreateModel .options,在每个迁移文件中添加'db_table:'app1_table_name'

add replaces = [('app1','migration_file_name')]。这将告诉Django的,目前的迁移(app2.migration_file_name)将取代旧的文件,这将prevenent Django的执行迁移两次

4-创建迁移文件忒重命名表,与migrations.AlterModelTable

+0

要添加对此,我发现当使用此方法重命名应用程序时,django不更新内容类型,而是在运行迁移时为每个应用程序模型创建新的内容类型(和权限)。如果你使用通用的外键等,这会造成麻烦。我通过在所有的'AlterModelTable'之前添加'RunPython'操作来解决这个问题。我的'RunPython'函数运行'ContentType = apps.get_model('contenttypes','ContentType')''ContentType.objects.filter(app_label ='old_app')。update(app_label ='new_app')' – DBrowne

0

重命名应用程序始终是一个棘手的问题。

如果您像进行简单的表重命名迁移那样进行迁移,则任何时候旧应用程序的apps.get_model()都无法工作,因为该应用程序根本不存在。我发现this answer。我知道你没有使用南方,但我认为可能以同样的方式工作,只是跳过南方的步骤。

基本上,你必须:

  1. 转储数据,之前重命名,为JSON文件

  2. 在回答运行该脚本从JSON文件重命名引用APP1APP2

  3. 重命名应用1APP2(所有进口引用,settings.py等)

  4. 运行迁移创建表的APP 2

  5. 负荷JSON文件中的数据到数据库

  6. APP1

我希望这可以帮到你。