Django要求在迁移过程中提供默认值

时间:2020-04-13 12:29:23

标签: python django django-models

我有以下型号:

    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中,而没有默认值;我们无法做到这一点(数据库需要一些东西来填充现有行)。

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

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

2 个答案:

答案 0 :(得分:1)

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

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

Django知道数据库中的表行,因此无法弄清楚用什么填充旧行的新字段。要解决此问题,请根据您新创建的字段的类型,更新字段并添加: default = None :如果您不介意与这些字段无关的字段,请考虑使用与该字段一致的默认字符串或int或float 并且还添加 blank = True

要使所有内容恢复原状,除了删除数据库外,您还需要删除关联的迁移文件。如果不确定是哪一个,请删除所有文件,但不要触摸文件夹中的 init 文件。然后进行迁移并迁移。

PS:我确定您知道使用最后一种方法会丢失模型中的所有记录。

答案 1 :(得分:1)

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

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

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

这意味着,如果您已经在将更改迁移到数据库之后添加了此ForeignKey字段,则django将不允许您在没有默认设置的情况下进行迁移,除非您删除迁移历史记录。