网上介绍这两者区别和联系的博客大部分都只说明了两点:
- blank用于表单的认证,被设为blank=False(默认为False)的字段在填写表单时不能为空。
- null用于规定数据库中的列的非空性,被设为null=False(默认为False)的字段在数据库中对应的列不能为空(用SQL来说明就是为该列添加了NOT NULL的约束)。
但是在使用的时候或许会有下面这一些疑问:
- 为什么要分别这设定两个参数,统一使用一个来规定非空性不可以吗,如果在填写表单时该字段不为空,那么数据库中该列也不为空不就可以了吗?
- 为什么我之前在只设定了blank=True而没有设定null=True的时候,通过表单创建模型实例,并且表单在该字段上没有值时数据库不报错呢(当没有设定null=True时,该列在数据库中就存在NOT NULL的约束,如果插入数据时这一列没有值,按理说数据库应该会报错才对)
这篇博客主要就是为了解释一些这些疑问,下面是详细的说明。
为什么要分别这设定两个参数,统一使用一个来规定非空性不可以吗,如果在填写表单时该字段不为空,那么数据库中该列也不为空不就可以了吗?
当存在两个参数时,总共会有四种设定组合
- blank=True、null=True。统一的表明了该字段(列)是可以为空的。
- blank=False、null=False。统一的表面了该字段(列)不可以为空。
- blank=True、null=False。这个设定的意义在于,某些字段并不希望用户在表单中创建(如slug),而是通过在save方法中根据其他字段生成。
- blank=False、null=True。这个设定不允许表单中该字段为空,但是允许在更新时或者通过shell等非表单方式插入数据该字段为空。
正是因为需要3、4两种设定,所以才需要两个参数(blank和null)来实现。
为什么我之前在只设定了blank=True而没有设定null=True的时候,通过表单创建模型实例并且表单在该字段上没有值时数据库不报错呢(当没有设定null=True时,该列在数据库中就存在NOT NULL的约束,如果插入数据时这一列没有值,按理说数据库应该会报错才对)
出现这种情况的原因在于,django在处理某些在数据库中实际的存储值为字符串的Field时(如CharField, TextField, ImageField(图片文件的路径)),永远不会向数据库中填入空值。如果表单中某个CharField或者TextField字段为空,那么django会在数据库中填入"",而不是null.