我在模型中添加了一个新字段,但此后我删除了db.sqlite3(以确保在下面不会出现错误)
agrawalo@:~/myapp> ls
README.md config core manage.py requirements.txt
但是在运行makemigrations时仍然出现此错误
agrawalo@:~/myapp> ./manage.py makemigrations
You are trying to add a non-nullable field 'high52' to stock without a default; we can't do that (the database needs something to populate existing rows).
Please select a fix:
1) Provide a one-off default now (will be set on all existing rows with a null value for this column)
2) Quit, and let me add a default in models.py
class Stock(models.Model):
name = models.CharField(max_length=255)
code = models.CharField(max_length=20, db_index=True)
price = models.DecimalField(max_digits=19, decimal_places=2)
diff = models.DecimalField(max_digits=19, decimal_places=2)
open_price = models.DecimalField(max_digits=19, decimal_places=2)
previous_close = models.DecimalField(max_digits=19, decimal_places=2)
low52 = models.DecimalField(max_digits=19, decimal_places=2)
high52 = models.DecimalField(max_digits=19, decimal_places=2)
last_updated = models.DateTimeField()
objects = DataFrameManager()
def save(self, *args, **kwargs):
''' On save, update timestamps '''
self.last_updated = timezone.now()
return super(Stock, self).save(*args, **kwargs)
def __str__(self):
return str(self.code)
low52和high52是新添加的字段。请注意,其他现有字段均不会引发此错误。
答案 0 :(得分:1)
您需要为blank
字段提供null
和high52
True。
high52 = models.SomeField(blank=True,null=True)
如果您不想这样做,则可以选择这两个选项中的任何一个。
例如,如果high52
是CharField
,则可以选择1选项并提供诸如'..'
之类的值,也可以在模型中设置默认值。py
答案 1 :(得分:1)
是否删除数据库文件都没有关系。 makemigrations不检查数据库。
仅当将非空字段添加到模型并进行初始迁移时,才能将其添加到模型。这是因为,在进行了初始迁移之后,Django无法知道是否将应用程序部署在其他地方,因此无法知道是否存在模型实例。一种可能出错的情况:
这里的解决方案是:
在您的情况下,我想提供一个一次性的默认值是可以的,因为听起来您还没有填充的数据库。
答案 2 :(得分:1)
您可以为该字段提供默认值
high52 = models.DecimalField(max_digits=19, decimal_places=2, default=0.0)
或者您可以将其设为可选
high52 = models.DecimalField(max_digits=19, decimal_places=2, null=True, blank=True)
您可以根据自己的选择做出决定。
要回答有关该错误的问题,可能在初始迁移本身中创建了先前存在的字段,并且它们不需要默认值。但是对于新添加的字段,您需要必填字段的默认值,并且此默认值将填充在现有记录中。这不取决于您是否删除了现有数据库。这取决于该模型的当前迁移状态。由于这不是初始迁移,因此您需要提供默认值或将其设为可选。