null 和 blank 是 Django model 中的 field 的参数。
null 是纯数据库相关的,表示该 field 对应的数据库字段可以为 NULL,跟 Django 本身的逻辑没有关系。blank 跟数据库无关,仅跟 Django Form 的数据校验有关,如果 blank 为 True,则提交表单数据到 Django form 时 Django 可以接受该字段没有值。
对于非关系字段,要表达一个字段「没有值」的最佳实践是:
- 对于字符串类型的 field(
CharField
及TextField
),不要置 null 为 True,使用 blank 为 True 即可,避免需要同时判断 null 及空字符串 - 对于其他类型,应该 同时 置 null 和 blank 为 True。因为:
- 一些类型的初始值往往不表示空,比如你给
IntegerField
置 0 不能表示它为空 - 一些类型没有合乎逻辑的初始值,比如你很难说
DateField
的初始值是多少
- 一些类型的初始值往往不表示空,比如你给
对于关系字段:
ForeignKey
可以同时置 null 及 blank 为 True,表示可以无关联的外键(参考 这里)OneToOneField
跟ForeignKey
一致ManyToManyField
字段无法置 null 及 blank 为 True,因为它并不对应一个数据库字段,而是对应一张单独的数据表