gpt4 book ai didi

django - 将 Django 模型字段的类型从 CharField 更改为 ForeignKey

转载 作者:行者123 更新时间:2023-12-03 14:30:14 25 4
gpt4 key购买 nike

我需要从 CharField 更改我的 Django 模型之一中的字段类型至 ForeignKey .这些字段已经填充了数据,所以我想知道什么是最好或正确的方法来做到这一点。我可以只更新字段类型并迁移,还是有任何可能的“问题”需要注意? 备注 :我只使用 vanilla Django 管理操作( makemigrationsmigrate ),而不是 South。

最佳答案

这很可能是您想要进行多阶段迁移的情况。我对此的建议如下所示。

首先,让我们假设这是您的初始模型,位于名为 discography 的应用程序中。 :

from django.db import models

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

现在,您意识到您想为艺术家使用外键。嗯,如上所述,这不仅仅是一个简单的过程。它必须分几个步骤完成。

第 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 .对于您的第二次迁移,重命名新字段 artist_linkartist .

这是分多个步骤完成的,以确保 Django 正确识别操作。您可以手动创建迁移来处理此问题,但我会将其留给您自己解决。

关于django - 将 Django 模型字段的类型从 CharField 更改为 ForeignKey,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35999186/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com