我有一个这样的模型(为了相关性而简化):
class Director(models.Model):
first_name = models.CharField(max_length=200)
last_name = models.CharField(max_length=200)
user_account = models.ForeignKey(User, null=True, blank=True)
我刚刚意识到user_account
需要是OneToOneField
而不是ForeignKey
。进行该更改本质上意味着删除现有的user_account
字段,创建新字段。
问题是,我过去在处理ForeignKey
字段时有过不好的经历。更糟糕的是,我已经在数据库中创建了几个Director
对象,其中ForeignKey
链接到User
对象。
我的问题是,如何删除并最终更改user_account
字段,而不会在以后导致运行时错误?
附加上下文:我使用的是Django 1.9和PostgreSQL。
ForeignKey
和OneToOneField
是相同的,只是OneToOneField
有一个唯一的约束。尝试更改模型中的字段并运行makemigrations
——我认为Django应该足够聪明,能够创建所需的迁移。
在开始之前,您需要确保没有多个控制器实例指向同一用户,因为一对一字段不允许这样做。
我认为您可以使用django migrations
来做到这一点。
-
添加一个指向模型
User
的OneToOne
字段,您可能需要为此添加related_name
。 -
创建一个将字段应用于数据库的迁移。
-
创建一个数据迁移,并将
ForeignKey
值从user_account
复制到每个Director
的新字段中。 -
删除模型中的
user_account
字段,然后创建另一个迁移以将删除应用于数据库。
ForeignKey
和OneToOneField
之间没有太大差异。如果直接运行更改模型字段类型,则数据不会受到干扰。更改模型字段类型后,运行makemigrations
。