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



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

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。

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

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

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

  1. 添加一个指向模型UserOneToOne字段,您可能需要为此添加related_name

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

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

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

ForeignKeyOneToOneField之间没有太大差异。如果直接运行更改模型字段类型,则数据不会受到干扰。更改模型字段类型后,运行makemigrations

最新更新