在django模型中定义字段时,有两种方式表示允许字段为空。null
表示该字段在数据库中可以为空,blank
表示该字段在表单中可以为空。为什么它们是不同的?每次我设置一个而不设置另一个,就会出问题。允许它们是不同的,似乎只会引起允许你创建数据库不接受的对象的形式的问题。
换句话说,你什么时候会在django模型中使用null=True,blank=False
或null=False,blank=True
?
它们有两个完全不同的含义:
blank:决定是否应该在表单中按要求验证字段。False
表示如果不提供,表单将产生错误,而True
表示允许空值。
null:决定该字段在DB级别是否应该设置为NULL
或NOT NULL
。这与表单验证无关。
一些例子:如果字段不是CharField或TextField,
blank=True, null=False
将在字段为空时引发IntegrityError
。这两个字段将''
(空字符串)而不是NULL
发送给DB。
blank=False, null=True
总是要求在所有表单中填写该字段(表单将在该字段上引发ValidationError
),即使允许该列为NULL
。然而,这只适用于表单。您可以手动将该属性设置为None
,并将其保存在表单外部(例如在shell中)。
null=False, blank=True
通常用于CharField
s,其中空白答案作为空字符串而不是空字符串存储在db中。反过来用就没有多大意义了。
对于非字符串字段,非答案存储为null
,因此您需要这两个字段。