將 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 正確識別操作。