將 CharField 更改為 ForeignKey

首先,我們假設這是你的初始模型,在名為 discography 的應用程式中:

from django.db import models

class Album(models.Model):
    name = models.CharField(max_length=255)
    artist = models.CharField(max_length=255)

現在,你意識到你想要為藝術家使用 ForeignKey。這是一個有點複雜的過程,必須分幾個步驟完成。

步驟 1,為 ForeignKey 新增一個新欄位,確保將其標記為 null(請注意,我們現在連結的模型現在也包括在內):

from django.db import models

class Album(models.Model):
    name = models.CharField(max_length=255)
    artist = models.CharField(max_length=255)
    artist_link = models.ForeignKey('Artist', null=True)

class Artist(models.Model):
    name = models.CharField(max_length=255)

…併為此更改建立遷移。

./manage.py makemigrations discography

第 2 步,填充新欄位。為此,你必須建立一個空遷移。

./manage.py makemigrations --empty --name transfer_artists discography

完成此空遷移後,你需要向其新增一個 RunPython 操作以連結你的記錄。在這種情況下,它可能看起來像這樣:

def link_artists(apps, schema_editor):
    Album = apps.get_model('discography', 'Album')
    Artist = apps.get_model('discography', 'Artist')
    for album in Album.objects.all():
        artist, created = Artist.objects.get_or_create(name=album.artist)
        album.artist_link = artist
        album.save()

現在你的資料已轉移到新欄位,你可以實際完成並保留所有內容,使用新的 artist_link 欄位表示所有內容。或者,如果要進行一些清理,則需要再建立兩次遷移。

對於第一次遷移,你需要刪除原始欄位 artist。對於第二次遷移,將新欄位 artist_link 重新命名為 artist

這是通過多個步驟完成的,以確保 Django 正確識別操作。