为啥 django 模型的空白和空值不同的选项?

Posted

技术标签:

【中文标题】为啥 django 模型的空白和空值不同的选项?【英文标题】:Why are blank and null distinct options for a django model?为什么 django 模型的空白和空值不同的选项? 【发布时间】:2011-12-30 20:28:09 【问题描述】:

在 django 模型中定义字段时,有两种方式表示允许该字段为空。 null 表示在数据库中可以为空,blank 表示在表单中该字段可以为空。为什么这些不同?每次我设置一个而不是另一个时都会出错。允许它们不同似乎只是在邀请表单的问题,允许您创建数据库不接受的对象。

换句话说,你什么时候会在 django 模型中使用null=True,blank=Falsenull=False,blank=True

【问题讨论】:

【参考方案1】:

它们有两种完全不同的含义:

空白:确定是否应在表单中按要求验证字段。 False 表示如果不提供表单将产生错误,而True 表示允许空值。

null:确定该字段应在数据库级别设置为NULL 还是NOT NULL。这与表单验证无关。

一些例子:

blank=True, null=False 将在字段留空时引发IntegrityError,如果它不是 CharField 或 TextField。这两个字段在为空时将''(空字符串)而不是NULL 发送到数据库。

blank=False, null=True 将始终要求在所有表单中填写该字段(表单将在该字段上显示ValidationError),即使该列允许为NULL。但是,这仅适用于表单。您可以手动将属性设置为 None 并将其保存在表单之外(例如,在 shell 中)。

【讨论】:

+1 的主要区别是null 影响数据库,而blank 影响表单验证。请注意,使用blank=False 设置的字段将允许您保存该字段没有值的模型。如果您尝试在 ModelForm 中这样做,它只会引发验证异常。 我看到克里斯在他的最后一段中说过。哦! blank=False,null=True 对我来说仍然没有意义。如果您在表格之外更改它,那么记录就会成为一个地雷,如果您尝试在表格中对其进行编辑,它就会爆炸。我看到了 blank=True,null=False 背后的逻辑,但反过来似乎不太可能有用,而且肯定会遇到问题。 我想你把那些搞混了。 blank=False,null=True 一点也不危险。这有点不合逻辑,因为它强制为可空字段设置值。但是,在某些用例中可能需要这样做,请记住,它仅在与表单一起使用时才需要。 blank=True,null=False,然而,可能导致 IntegrityError,但是对于 CHAR 和 TEXT 字段类型,Django 总是存储一个空字符串,而不是 NULL,因此在这些字段类型中很常见。跨度> blank=False,null=True 的问题在于您可以通过编程方式创建无法使用标准表单进行编辑的对象。它们将显示,但您无法在不更改该字段的情况下保存它们。这是没有意义的——这有什么可能的用例?为什么你想要一个强制你修改有效对象的表单?【参考方案2】:

null=False, blank=TrueCharFields 中很常见,其中空白答案作为空白字符串而不是空值存储在数据库中。反之则没有多大意义。

对于非字符串字段,非答案存储为 null,因此您需要两者。

【讨论】:

为什么人们会想要这种行为呢?在数据库中存储一堆空白字符串而不是根本没有值有什么好处?

以上是关于为啥 django 模型的空白和空值不同的选项?的主要内容,如果未能解决你的问题,请参考以下文章

设置空白和空值时,django 表单字段会引发错误

django modelform 为空显示空白

模型 CharField 空白和空

Select2 多选空白选项始终选中

左外连接和空值转换

自定义/删除 Django 选择框空白选项