Django 在迁移期间要求默认值

Posted

技术标签:

【中文标题】Django 在迁移期间要求默认值【英文标题】:Django asking for default value during migration 【发布时间】:2020-07-26 00:19:50 【问题描述】:

我有以下型号:

    title = models.CharField(max_length=100)
    description = models.TextField()
    date_posted = models.DateTimeField(default=timezone.now)
    author = models.ForeignKey(User, on_delete=models.CASCADE)

    def __str__(self):
        return self.title

    def get_absolute_url(self):
        return reverse('post-detail', kwargs='pk': self.pk)


class Ingredient(models.Model):
    ingredients_recipe = models.ForeignKey(Post, on_delete=models.CASCADE)
    type = models.CharField(max_length=50)
    quantity = models.IntegerField()
    measurement = models.CharField(max_length=50)


class MethodStep(models.Model):
    methods_recipe = models.ForeignKey(Post, on_delete=models.CASCADE, null=True)
    step = models.TextField()

当我尝试运行 makemigrations 时,Ingredient 类没有错误,但在 MethodStep 类上我收到错误消息:

您正在尝试在没有默认值的情况下将不可为空的字段“methods_recipe”添加到方法步骤;我们不能这样做(数据库需要一些东西来填充现有的行)。

有人可以帮助我吗?我不确定这些类中的每一个有什么不同,这意味着MethodStep 有错误但Ingredient 没有。

编辑:我也尝试过删除/清除/删除数据库,但每次运行 makemigrations 时错误仍然存​​在。

【问题讨论】:

您有一个现有的数据库,现在您添加了一个不可为空的新字段。您在表中的现有记录必须将 something 放入新字段 - 这是它要求的默认值。这可能会有所帮助***.com/questions/29787853/… @PatrickArtner,应该在上面添加,我已经尝试删除和清除数据库,但同样的错误仍然存​​在。 django 怎么知道数据库是空的? 【参考方案1】:

有时除了重置数据库之外,您还必须从项目中删除所有现有的迁移(或者至少是这些模型所属的包的迁移)。

删除迁移文件夹中的所有文件,_init__.py 文件除外。

当简单地转储您的数据库并重新启动 django 时,启动将按照它们创建的顺序应用迁移历史记录。

这意味着如果您在将更改迁移到数据库之后添加此 ForeignKey 字段,除非您删除迁移历史记录,否则 django 不会让您在没有默认值的情况下迁移。

【讨论】:

【参考方案2】:

这发生在您创建模型字段之后。

这是因为自上次迁移以来,您在表/模型中添加了行/对象。

Django 知道您的数据库中的表行,并且无法确定为旧行填充新字段的内容。要解决此问题,根据您新创建的字段类型,更新字段添加: default=None :如果您不介意那些没有任何关系的字段,否则请考虑一些默认字符串或 int 或与该字段保持一致的浮点数 并且还添加 空白 = 真

要让一切恢复原状,除了删除您的数据库之外,您还需要删除相关的迁移文件。如果您不确定是哪个,请将它们全部删除,但不要触摸文件夹中的 init 文件。然后进行迁移和迁移。

PS:我相信你知道最后一种方法会丢失模型中的所有记录。

【讨论】:

以上是关于Django 在迁移期间要求默认值的主要内容,如果未能解决你的问题,请参考以下文章

具有默认值的外键上的 Django 1.7 迁移错误

Django 迁移错误:字段“名称”没有默认值

Django迁移默认值可调用生成相同的条目

Django 模型字段可调用默认值不起作用

Django IntegrityError:没有默认值

Django模型南0.7.6迁移问题:表中的任何更改与另一个字段的默认值百分比