IntegrityError的原因是什么:NOT NULL约束失败了?

时间:2017-04-22 05:47:33

标签: django database

我在Django文档中执行民意调查应用程序:Writing your first Django app, part 2。使用Database API时,我发现了IntegrityError。

轮询/ models.py

class Question(models.Model):
    question_text=models.CharField(max_length=200)
    pub_date=models.DateTimeField('date published')

我试图创建一个问题模型的对象。

Question.objects.create(question_text="What's up?")

这会产生错误

  

IntegrityError:NOT NULL约束失败:polls_question.pub_date

但是当我尝试这个时

Question.objects.create(pub_date=timezone.now())

它成功创建了一个对象。

第一种情况下IntegrityError的原因是什么?为什么它在第二种情况下不会产生任何错误?

2 个答案:

答案 0 :(得分:2)

来自django doc

  

避免在基于字符串的字段(如CharField和TextField)上使用null。如果基于字符串的字段具有null = True,则表示它具有“无数据”的两个可能值:NULL和空字符串。在大多数情况下,为“无数据”提供两个可能的值是多余的; Django约定是使用空字符串,而不是NULL。

  • 因此,如果{ "data": [ {"densityId":"11","densityDescription":"Mcvr"}, {"densityId":"14","densityDescription":"test"} ] } (默认),django将使用空字符串(表示不是 NULL)
  • 如果null=False,字段可以写null=True(意味着NULL来到python)

所以简而言之:     Django不会为NoneIntegrityError: NOT NULL constraint提出CharField

答案 1 :(得分:0)

更改您的型号代码,如下所示

class Question(models.Model):
    question_text=models.CharField(max_length=200)
    pub_date=models.DateTimeField('date published', auto_now_add=True)

现在尝试查询它将起作用

Question.objects.create(question_text="What's up?")

原因: 您正尝试使用单个值question_text创建问题对象,但pub_date也是必填字段。但你没有提供它。 即使您没有提供auto_now_add值,pub_date也会自动提供当前日期时间。

如果我们尝试在数据库表中创建一行而不提供所有必填字段,则会引发

IntegrityError