我有以下型号:
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
时错误仍然存在。
答案 0 :(得分:1)
这是在创建模型字段之后发生的。
这是因为自上次迁移以来,已在表/模型中添加了行/对象。
Django知道数据库中的表行,因此无法弄清楚用什么填充旧行的新字段。要解决此问题,请根据您新创建的字段的类型,更新字段并添加: default = None :如果您不介意与这些字段无关的字段,请考虑使用与该字段一致的默认字符串或int或float 并且还添加 blank = True
要使所有内容恢复原状,除了删除数据库外,您还需要删除关联的迁移文件。如果不确定是哪一个,请删除所有文件,但不要触摸文件夹中的 init 文件。然后进行迁移并迁移。
PS:我确定您知道使用最后一种方法会丢失模型中的所有记录。
答案 1 :(得分:1)
有时,除了重置数据库外,您还必须从项目中删除所有现有的Migrations(或至少删除这些模型所属的软件包的Migrations)。
删除迁移文件夹中除_init__.py文件以外的所有文件。
当简单地转储数据库并重新启动django时,启动将按照创建它们的顺序应用迁移历史记录。
这意味着,如果您已经在将更改迁移到数据库之后添加了此ForeignKey字段,则django将不允许您在没有默认设置的情况下进行迁移,除非您删除迁移历史记录。