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 在迁移期间要求默认值的主要内容,如果未能解决你的问题,请参考以下文章