簡體   English   中英

從一個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)])

問題是數據庫中已經有一些數據,因此我必須將數據遷移到新結構中,最簡單,最干凈的方法是什么?

我將進行三步遷移。

  1. 創建新字段

1.1。 創建TypingResult模型,然后創建TypingResult typing_result = models.ForeignKey(TypingResult, blank=True, null=True)字段。 通過將FK設置為​​空白和可空來確保FK是可選的

1.2遷移檢查點

  1. 數據遷移

2.1使用本指南https://docs.djangoproject.com/zh-CN/1.11/topics/migrations/#data-migrations創建一個空遷移,並添加有關數據遷移的說明。

2.2數據遷移步驟如下:

  • 遍歷所有TextResult ,為它們每個創建一個帶有相應數據的TypingResult

  • 通過FK將TextResult鏈接到TypingResult

2.3運行遷移到檢查點

  1. 清理

3.1刪除TextResult上的wpm和TextResult字段,並使ForeignKey為非可選。

3.2運行遷移

結論

這大概可以一步完成,但是最好了解發生了什么。 此外,在.save()調用之前添加pdb將使您能夠檢查數據遷移的步驟

import pdb; pdb.set_trace()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM