【问题标题】:How to add in Django a non-nullable ForeignKey to an existing table?如何在 Django 中将不可为空的 ForeignKey 添加到现有表中?
【发布时间】:2020-08-26 21:28:25
【问题描述】:

我有以下型号:

class Parent(models.Model):
    name = CharField(max_length=80, ...)

class Child(models.Model):
    name = CharField(max_length=80, ....)

我想添加一个不可为空的外键,如下所示:

class Child(models.Model):
    name = CharField(max_length=80, ....)
    parent = ForeignKey(parent)  

两个表都已存在于数据库中,但没有数据。

当运行 makemigrations Django 要求一个默认值。如果我不想提供默认值,最好执行 2 次迁移,第一次使用 null=True 然后运行第二次 null=False,在 DDBB 中摄取数据之前?

感谢您的建议。

【问题讨论】:

    标签: django django-models


    【解决方案1】:

    运行两次迁移不会解决任何问题。在运行第二次迁移时,您会再次收到警告,您必须提供默认值。

    您对现有子实例的意图是什么?您打算如何填充父列?

    【讨论】:

    • 1) 您对现有子实例的意图是什么?我想创建两个模型之间的关系。 2)你打算如何填充父列?:由于两个表都是空的,一旦迁移完成,我将包含满足这个要求的逻辑。
    • 好的,那么您在运行原始迁移时,Django 提供了一个选项,可以将现有行留空。如果这样做,应用程序将无法正确运行,直到您自己填写值。
    【解决方案2】:

    如果两个表中都没有数据,那么你选择什么来提供一次性默认值并不重要,只需将其设置为 1(如果是外键,它作为 ID 工作,但由于没有数据它没关系)。

    如果这些表中有数据,那么您必须先使用null=True 进行两步迁移,然后在迁移脚本中迁移数据,然后将其设置为null=False。

    【讨论】:

      猜你喜欢
      • 2016-08-09
      • 1970-01-01
      • 2015-02-21
      • 2013-10-30
      • 2019-02-18
      • 2013-04-04
      • 1970-01-01
      • 1970-01-01
      • 2016-01-23
      相关资源
      最近更新 更多