Django 字段中 null 和 blank的区别
blank
- 设置为 True 时,字段可以为空
- 设置为 False 时,字段是必须填写的
- 默认为 False
null
- 设置为 True 时,数据库的字段允许为NULL,而且表单中的空值将会被存储为NULL
- 设置为 False 时,数据库的字段不允许为NULL
- 默认为 False
概括来说:
- blank只是在表单验证的时候会检测你是否可以为空
- null则是在表单数据为空值时会向数据库插入NULL
但是由于各数据类型的特点,使用效果也不相同:
Field 类型 | 设置null=True | 设置blank=True |
---|---|---|
CharField, TextField, SlugField, EmailField, CommaSeparatedIntegerField等 |
不要设置 django规定储存空字符串来代表空值, 当从数据库中读取NULL或空值时都为空字符串 |
可以设置 设置后允许接受widget中为空值(即不填写), 储存到数据库时空值变为空字符串 |
FileField, ImageField |
不要设置 django实际储存的是路径的字符串, 因此同上 |
可以设置 同上 |
BooleanField | 不要设置 因为有NullBooleanField代替 |
不要设置 |
IntegerField, FloatField, DecimalField等 |
可以设置 如果你希望在数据库中能储存NULL |
可以设置 设置后允许接受widget中为空值(即不填写), 设置为True时必须同时设置null=True |
DateTimeField, DateField, TimeField等 |
可以设置 如果你希望在数据库中能储存NULL |
可以设置 设置后允许接受widget中为空值(即不填写), 设置为True时必须同时设置null=True |
ForeignKey, ManyToManyField, OneToOneField |
可以设置 如果你希望在数据库中能储存NULL |
可以设置 设置后允许接受widget中为空值(即不填写) |
GenericIPAddressField | 可以设置 如果你希望在数据库中能储存NULL |
可以设置 设置后允许接受widget中为空值(即不填写) |
IPAddressField | 不推荐设置 用GenericIPAddressField代替 |
不推荐设置 用GenericIPAddressField代替 |
附上一个博客链接:
https://www.b-list.org/weblog/2006/jun/28/django-tips-difference-between-blank-and-null/