【问题标题】:Migrate from one django model to two models referenced with a foreign key从一个 django 模型迁移到使用外键引用的两个模型
【发布时间】:2017-10-24 02:50:50
【问题描述】:

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

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

【问题讨论】:

  • 你创建一个迁移,创建新表和外键列,然后遍历所有行将数据复制到新表并设置外键,最后删除旧的主表中的列。您应该能够从 Django 自动创建的迁移文件中挽救一些代码。

标签: python django model foreign-keys migrate


【解决方案1】:

我会进行 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创建一个带有相应数据的TypingResult

  • 通过 FK 将 TypingResult 链接到 TextResult

2.3 运行迁移到检查点

  1. 清理

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

3.2 运行迁移

结论

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

import pdb; pdb.set_trace()

【讨论】:

  • 如果您需要更多分步帮助,请告诉我。对于我提到的链接,我会一直阅读到Accessing models from other apps
  • 谢谢,我能够根据你的解决方案解决我的问题,我想了一下,得出的结论是使用继承更好,我为此创建了一个新问题,因为它相似但不一样。我只使用了一次迁移,因为任务相对简单。您可以在我的答案中找到代码:stackoverflow.com/a/44170808/4129587
猜你喜欢
  • 2011-12-14
  • 2012-02-28
  • 2019-07-30
  • 2015-12-21
  • 1970-01-01
  • 2017-08-30
  • 1970-01-01
  • 2010-12-23
  • 2011-12-03
相关资源
最近更新 更多