【问题标题】:How to delete ForeignKey field from model safely?如何安全地从模型中删除 ForeignKey 字段?
【发布时间】:2016-04-18 22:04:46
【问题描述】:

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

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。

【问题讨论】:

    标签: django postgresql django-models foreign-keys


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 如果我确实有多个导演指向同一个用户,@ShangWang 的答案是正确的。
      【解决方案3】:

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

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

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

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

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

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-07-21
      • 2017-12-15
      • 2020-02-04
      • 2012-02-18
      • 2011-06-13
      • 2015-11-30
      • 1970-01-01
      相关资源
      最近更新 更多