我是django的新手,现在遇到了一些问题。
这是我以前的模特。
class Blog(models.Model):
name = models.CharField(max_length=100)
tagline = models.TextField()
我向该模型添加了一些数据。之后,我又添加了一个字段。现在我的模型如下所示。
class Blog(models.Model):
name = models.CharField(max_length=100)
tagline = models.TextField()
age = models.IntegerField()
[当我运行命令python manage.py makemigrations
时,出现以下明显的错误。
You are trying to add a non-nullable field 'age' to blog 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
Select an option:
我不想添加默认,所以我通过访问db.sqlite3来已删除表内容
但是在运行python manage.py makemigrations
之后再次出现相同的错误。为什么?
即使您删除了表,对Django模型的任何更改都将始终引用该模型的先前迁移,因此仍然需要您设置默认值。如果您仍在开发中,则可以删除该模型的迁移,然后再次进行迁移。但是,这是一种可怕的做法,除非您有意识地挤压模型,否则切勿这样做,更好的方法是执行Django告诉您的操作并设置默认值。从长远来看,这将有助于错误处理。
其他答案解决了如何很好地设置默认值。
当您向数据库表中添加新字段(即列)时,该字段适用于表中的所有行...现有行和任何新行。如果该字段不能为null
,则必须为所有现有行指定一些值。
默认情况下,IntegerField()
是不可为空的。这说明了为什么收到警告。您有几种选择:
blank
和null
参数,以允许该字段接受空值。对于最后一个选项,您可以这样做:
models.IntegerField(blank=True, null=True)
但是根据您的用例,这可能不是最佳选择。如果可空值对您的字段没有意义,我将避免使该字段支持空值。
age = models.IntegerField(null=True)
Django模型字段默认为null设置为true。
您可以解决此问题的方法:
希望这可以解决您的问题。
按照Django的要求,然后如果不需要,可以删除default
属性。但是无论如何都要保留它是一个好习惯