如何安全地从模型中删除ForeignKey字段?

时间:2016-01-13 19:07:50

标签: django postgresql django-models foreign-keys

我有一个这样的模型(简化为相关性):

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。

3 个答案:

答案 0 :(得分:2)

ForeignKeyOneToOneField相同,但OneToOneField具有唯一约束。尝试更改模型中的字段并运行makemigrations - 我认为Django应该足够聪明,能够创建所需的迁移。

在开始之前,您需要确保没有多个导向器实例指向同一个用户,因为一对一的字段不允许这样做。

答案 1 :(得分:1)

我认为你可以使用django migrations来做到这一点。

  1. 添加指向模型OneToOne的{​​{1}}字段,您可能需要为其添加User

  2. 创建一个将该字段应用于数据库的迁移。

  3. 创建数据迁移并将related_name值从ForeignKey复制到每个user_account的新字段。

  4. 删除模型中的Director字段,然后创建另一个迁移以将删除应用于数据库。

答案 2 :(得分:1)

ForeignKeyOneToOneField之间没有太大区别。如果直接运行更改模型字段类型,则不会干扰您的数据。更改模型字段类型后,运行makemigrations