将 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 正确识别操作。