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

时间:2017-05-24 00:04:09

标签: python django model foreign-keys migrate

我需要将以下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)])

问题是,数据库中已经存在一些数据,所以我必须将数据迁移到新结构,实现这一目标的最简单,最简洁的方法是什么?

1 个答案:

答案 0 :(得分:1)

我会做三步迁移。

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

    1.2迁移检查点

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

      2.2数据迁移步骤如下:

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

      • TypingResult链接到TextResult到FK

      2.3运行迁移到检查点

      1. 清除
      2. 3.1删除TextResult上的wpm和准确性字段,并使ForeignKey不可选。

        3.2运行迁移

        <强>结论

        这可能都是一步完成,但最好能够了解正在发生的事情。在.save()调用之前添加pdb将允许您检查数据迁移的步骤

        import pdb; pdb.set_trace()