2017-09-05 179 views
1

在Django中我用下面的models.py文件manage.py makemigrationsmanage.py migrate不可为空场:Django的:没有默认

class Family(models.Model): 
    comment1 = models.CharField(max_length=80) 
    #comment2 = models.CharField(max_length=80) 

这个初始化成功后,我改变了models.py到(我只是取消注释这基本上是其他模型场的副本)的新模式场:

class Family(models.Model): 
    comment1 = models.CharField(max_length=80) 
    comment2 = models.CharField(max_length=80) 

现在,当我尝试makemigrations我再次碰到下面的错误

您尝试添加不可为空场“注释”家庭不 默认;我们不能这样做(数据库需要一些东西来填充 现有的行)。

请选择修复:

1)提供一次性默认现在 (将所有现有的行与空值此列集)

2)退出,并让我在models.py中添加一个默认值选择一个选项:

为什么我在初始化初始化时没有得到这个错误?

+1

因为您是从头开始创建表。现在,正如错误明确指出的那样,数据库需要一些东西来填充现有的行。 –

+0

但没有现有的行。就像我初始化时一样! – user3182532

+0

好吧我想我明白了。尽管没有现有的行,原则上可能存在。然后Django不知道如何保存现有行的“comment2”,因为它不能将它们保存为null,并且它们没有值。在Django知道的第一次迁移中:我创建了一个表,因此没有以前的数据,因此null = False +没有默认值是可以的。用户将只能保存具有“comment1”值的对象,但这是他的问题。 – user3182532

回答

0

您需要提供默认或允许它使用空空白,怎么也有不具备注释2以前的数据。

comment2 = models.CharField(max_length=80,null=True,default='hi') 

或者

comment2 = models.CharField(max_length=80,null=True,blank=True) 
+0

以前没有数据,数据库是空的! – user3182532

+0

但是,您首先进行了迁移并仅使用comment1进行迁移,然后再次使用comment1和comment2,这可能是原因。 –

+0

但是,以任何方式提供默认值都是很好的做法。 –

0

如果你想让它不为空的,但没有默认。 当您创建迁移文件时,您必须为同一字段提供值。这就是为什么它要求选择。在python manage.py makemigrations中输入“1”,然后为先前保存的行(如果有)提供一个值。

让我知道这是否有帮助。

0

其他都是对的。你应该为该字段设置一个默认值。 但有一个技巧,你可以解决这个问题。但这不是一个好方法......只有当你没有选择时。
1.评论所有表
2.运行makemigrationsmigrate
3.取消注释你的表
4.2。运行makemigrationsmigrate再次