我有一个这样的模型(简化为相关性):
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。
答案 0 :(得分:2)
ForeignKey
和OneToOneField
相同,但OneToOneField
具有唯一约束。尝试更改模型中的字段并运行makemigrations
- 我认为Django应该足够聪明,能够创建所需的迁移。
在开始之前,您需要确保没有多个导向器实例指向同一个用户,因为一对一的字段不允许这样做。
答案 1 :(得分:1)
我认为你可以使用django migrations
来做到这一点。
添加指向模型OneToOne
的{{1}}字段,您可能需要为其添加User
。
创建一个将该字段应用于数据库的迁移。
创建数据迁移并将related_name
值从ForeignKey
复制到每个user_account
的新字段。
删除模型中的Director
字段,然后创建另一个迁移以将删除应用于数据库。
答案 2 :(得分:1)
ForeignKey
和OneToOneField
之间没有太大区别。如果直接运行更改模型字段类型,则不会干扰您的数据。更改模型字段类型后,运行makemigrations
。