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