从一个 django 模型迁移到两个用外键引用的模型

Migrate from one django model to two models referenced with a foreign key

我需要将以下 Django 模型中的一些属性外包:

class TextResult(models.Model):
    user = models.ForeignKey(settings.AUTH_USER_MODEL, default=1)
    text = models.ForeignKey(Text)
    # following fields will be in the referenced model
    wpm = models.FloatField(default=0.0)
    accuracy = models.FloatField(default=1.0,
                                 validators=[MinValueValidator(0.0),
                                             MaxValueValidator(1.0)])

引用特定数据的模型:

class TextResult(models.Model):
    user = models.ForeignKey(settings.AUTH_USER_MODEL, default=1)
    text = models.ForeignKey(Text)
    typing_result = models.ForeignKey(TypingResult)

class TypingResult(models.Model):
    wpm = models.FloatField(default=0.0)
    accuracy = models.FloatField(default=1.0,
                                 validators=[MinValueValidator(0.0),
                                             MaxValueValidator(1.0)])

问题是,数据库中已经有一些数据,所以我必须将数据迁移到新结构,最简单、最干净的方法是什么?

我会进行 3 步迁移。

  1. 创建新字段

1.1。创建 TypingResult 模型和 typing_result = models.ForeignKey(TypingResult, blank=True, null=True) 字段。确保 FK 是可选的,使其可以为空白和为空

1.2 迁移检查点

  1. 数据迁移

2.1 使用本指南创建空迁移 https://docs.djangoproject.com/en/1.11/topics/migrations/#data-migrations 并添加数据迁移说明。

2.2数据迁移步骤如下:

  • 遍历所有 TextResult 为每个创建一个 TypingResult 和相应的数据

  • Link TypingResultTextResult 通过 FK

2.3 运行 迁移到检查点

  1. 清理

3.1 删除 TextResult 上的 wpm 和 accuracy 字段,并使 ForeignKey 成为非可选字段。

3.2运行迁移

结论

这可能都可以在 1 个步骤中完成,但最好了解发生了什么。在 .save() 调用之前添加 pdb 将允许您检查数据迁移的步骤

import pdb; pdb.set_trace()