从一个 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。创建 TypingResult
模型和 typing_result = models.ForeignKey(TypingResult, blank=True, null=True)
字段。确保 FK 是可选的,使其可以为空白和为空
1.2 迁移检查点
- 数据迁移
2.1 使用本指南创建空迁移 https://docs.djangoproject.com/en/1.11/topics/migrations/#data-migrations 并添加数据迁移说明。
2.2数据迁移步骤如下:
遍历所有 TextResult
为每个创建一个 TypingResult
和相应的数据
Link TypingResult
到 TextResult
通过 FK
2.3 运行 迁移到检查点
- 清理
3.1 删除 TextResult
上的 wpm 和 accuracy 字段,并使 ForeignKey 成为非可选字段。
3.2运行迁移
结论
这可能都可以在 1 个步骤中完成,但最好了解发生了什么。在 .save()
调用之前添加 pdb 将允许您检查数据迁移的步骤
import pdb; pdb.set_trace()
我需要将以下 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。创建 TypingResult
模型和 typing_result = models.ForeignKey(TypingResult, blank=True, null=True)
字段。确保 FK 是可选的,使其可以为空白和为空
1.2 迁移检查点
- 数据迁移
2.1 使用本指南创建空迁移 https://docs.djangoproject.com/en/1.11/topics/migrations/#data-migrations 并添加数据迁移说明。
2.2数据迁移步骤如下:
遍历所有
TextResult
为每个创建一个TypingResult
和相应的数据Link
TypingResult
到TextResult
通过 FK
2.3 运行 迁移到检查点
- 清理
3.1 删除 TextResult
上的 wpm 和 accuracy 字段,并使 ForeignKey 成为非可选字段。
3.2运行迁移
结论
这可能都可以在 1 个步骤中完成,但最好了解发生了什么。在 .save()
调用之前添加 pdb 将允许您检查数据迁移的步骤
import pdb; pdb.set_trace()