如何重命名一个Django应用程序并将数据从一个应用程序迁移到另一个应用程序。

30 浏览
0 Comments

如何重命名一个Django应用程序并将数据从一个应用程序迁移到另一个应用程序。

我有一个名为app1的Django应用程序,其中包含模型和迁移文件。

我将此应用程序重命名为app2,并修复了所有的导入、URL等问题。

现在我在迁移文件和表中的数据方面遇到了问题。

我应该如何正确编写迁移以确保:

  • 新安装 => 创建新表
  • 更新旧版本 => 创建新表、移动数据、删除旧表

注1:有多个表,其中包含许多外键。

以下是我目前的进展,我不确定是否走在正确的道路上:

  • 我删除了所有旧的迁移文件
  • 我运行python manage.py makemigrations来生成新的迁移文件

完成这两个步骤后,我可以安装我的应用程序,但我仍然在旧版本上遇到问题。

问题:迁移数据的最佳方法是什么?

注2:我不使用South

0
0 Comments

从上面的内容中,我们可以得到以下信息:

问题的原因:

- 需要更改Django应用程序的名称

解决方法:

1. 重命名要更新的应用程序的文件夹。

2. 更新任何导入语句,以便引用更新后的文件夹。

3. 更新django_content_type表中的条目,以便引用应用程序的app_label

4. 更新任何未显式设置表名的模型的表名。这些表名是由应用程序名称推断出来的,需要更新。

5. 更新django_migrations表的条目,并通过设置新的应用程序标签来更新每个迁移的引用。

6. 更新位于/static/templates文件夹中的任何命名空间文件夹的名称。例如,你可能有./foo_app/templates/foo_app/index.html,需要更新为./bar_app/templates/bar_app/index.html

文章如下:

如何重命名Django应用程序并将数据从一个应用程序迁移到另一个应用程序

这个问题的解答可以在这篇博客文章中找到。

具体步骤如下:

1. 重命名要更新的应用程序的文件夹。

2. 更新任何导入语句,以便引用更新后的文件夹。

3. 更新django_content_type表中的条目,以便引用应用程序的app_label

4. 更新任何未显式设置表名的模型的表名。这些表名是由应用程序名称推断出来的,需要更新。

5. 更新django_migrations表的条目,并通过设置新的应用程序标签来更新每个迁移的引用。

6. 更新位于/static/templates文件夹中的任何命名空间文件夹的名称。例如,你可能有./foo_app/templates/foo_app/index.html,需要更新为./bar_app/templates/bar_app/index.html

0
0 Comments

重新命名一个Django应用程序并迁移数据到另一个应用程序是一个棘手的问题。如果像简单重命名表的迁移一样进行迁移,那么在任何时候旧应用程序的apps.get_model()将无法工作,因为该应用程序根本不存在。我在stackoverflow找到了这个答案。我知道你没有使用south,但我认为它可能以相同的方式工作,只需跳过south步骤。基本上,你需要: 1. 在重命名之前将数据转储到json文件中 2. 运行答案中的脚本,将json文件中的引用从app1重命名为app2 3. 将app1重命名为app2(包括所有导入引用、settings.py等) 4. 运行迁移以创建app2的表 5. 将数据从json文件加载到数据库中 6. 删除app1的表。希望对你有所帮助。

0
0 Comments

如何重命名Django应用并将数据从一个应用迁移到另一个应用

问题的出现原因:

- 重命名Django应用时,可能会遇到以下问题:

1. 旧的迁移文件需要更新,以适应新的外键和新的应用依赖关系。

2. 旧的迁移文件需要强制使用旧的应用名称创建表。

3. Django在重命名应用时不会更新内容类型,可能会导致在运行迁移时为每个应用模型创建新的内容类型和权限。

解决方法:

1. 修复旧的迁移文件,使其适应新的外键和新的应用依赖关系。

2. 强制旧的迁移文件使用旧的应用名称创建表。在`migrations.CreateModel.options`中添加`db_table: 'app1_table_name'`。

3. 在每个迁移文件中添加`replaces = [('app1', 'migration_file_name')]`。这将告诉Django当前迁移文件(`app2.migration_file_name`)将替换旧文件,防止Django执行两次迁移。

4. 创建一个迁移文件,使用`migrations.AlterModelTable`来重命名表。

补充说明:

- 当使用上述方法重命名应用时,Django不会更新内容类型,而是在运行迁移时为每个应用模型创建新的内容类型和权限。这可能会导致使用通用外键等功能时出现问题。

- 为了解决这个问题,可以在所有`AlterModelTable`之前添加一个`RunPython`操作。`RunPython`函数中运行`ContentType = apps.get_model('contenttypes', 'ContentType')`和`ContentType.objects.filter(app_label='old_app').update(app_label='new_app')`,以更新内容类型。

通过上述方法,我们可以解决重命名Django应用并迁移数据的问题。这些方法可以节省大量时间,并且在日常开发中很少使用,因此很容易忽略。

0