nullとblankオプションの違い
Djangoのモデルフィールドを設定する際に、オプションで設定するnullとblankはどう違のか。
一般的には
「nullはデータベースの中身が空かどうか、blankはフォーム送信時の入力が空であるかどうか」
であるとされています。
デフォルトではnullもblankもどちらもFalseで、それぞれデータベースの中身が空でないこと、フォーム送信時の入力が必須であると要求していることになります。ではなぜ、別々にオプションを設定する必要があるのでしょうか、以下の4パターンを事例に整理してみます。
1.null=False, blank=Falseの場合(デフォルト)
直訳すると「フォーム送信時にこのフィールドの入力は必須です。データベースに格納されるデータも空であってはいけません」ということになります。
ユーザー情報の入力画面で、Emailなどの必須項目のフィールド設定を行う際にはよく使うオプション設定になります。この設定はデフォルトになっているので、入力必須フィールドはnullとblankのオプション設定は特に必要ないということになります。
2.null=True, blank=Trueの場合
直訳すると「フォーム送信時にこのフィールド入力は必須ではありません。データベースに格納されるデータも空で問題ありません」ということになります。
ユーザー情報の入力画面で外部リンクなど任意項目のフィールド設定を行う際によく使うオプションになります。
3.null=False, blank=Trueの場合
直訳すると「フォーム送信時にこのフィールドの入力は必須ではありません。しかしデータベースに格納されるデータは空(null)であってはいけません」ということになります。
これは特殊な例で、未入力のフィールドを送信するとImageFieldやDateFieldなどはデータベースにnullが格納されてしまいます。一方でCharFieldやTextFieldなどの文字列型である場合は、空の値はnullではなく、空文字列として格納されます。そのため文字列を扱うフィールドに限り使用可能なオプション設定であると言えます。
4.null=True, blank=Falseの場合
直訳すると「フォーム送信時にこのフィールドの入力は必須です。しかしデータベースに格納されるデータは空であっても構いません」ということになります。
このパターンも使う機会が非常に少ないのではないかと思います。
まとめ
- nullはデータベースに格納される値が空(null)でもいいかどうか、blankはフォーム送信時に入力必須フィールドであるかどうか。
- デフォルトではnull、blankオプションはどちらもFalseで、入力必須フィールドであるとともに、データベースに(null以外の)何かしらの値が入っている必要がある。
- 必須項目でなく、任意項目のフィールドにはnull、blankオプションをどちらもTrueに設定する。
- 基本的にはnull、blankどちらもFalseかTrueで統一されて使われる場面が多い
参考