Skip to main content

Djangoのnullの扱い方

· 4 min read

Djangoでnullをセットしようとした場合、ちょっとしたコツが必要。 コツというか、考え方としては突拍子なわけでもない。 ただ、知らないとどうしていいのかわかんない。

モデルフィールドリファレンス — Django v1.0 documentation

http://djangoproject.jp/doc/ja/1.0/ref/models/fields.html#django.db.models.fields.Field.nullまずはここに書いてあること。
空の文字列値は NULL ではなく空文字列として保存されることに注意して下さい。 null=True が使えるのは、整数型やブール型、日付のような、文字列ではないフィールド型の場合だけです。 null はデータベースでの記録操作にのみかかわるパラメタなので、フォーム上で空の値を入力できるようにしたければ blank=True も指定する必要があるでしょう (blank も参照してください)。

具体的には、

  • 文字列はnullを扱えない
  • nullをセットしたかったらnull=Trueを使う
  • ForeignKeyの場合はblank=True, null=Trueと併せて使う

ということ。

勝手な解釈ではあるが、

  • 空文字はわかるけど、文字が無いってなんか変じゃない?
  • nullにしたい場合は明示的に
  • ForeignKeyみたいな場合は未入力(blank)を許しつつ、参照してるんだからnullも許可させる必要がある

ってことなんじゃないかな。 なぜ、blankとnullみたいな、似たような項目があるのか?ということについては似て非なるものだからだと思ってる。 blankについては入力時のチェックに使う、validationに関する項目。 nullについてはデータの存在意義(意義というとちょっと違うかな)についての定義。 こう考えると、文字列はblankを許可する必要はあるかもしれないけど、値が無いってのはおかしいでしょ?だから、null=Trueなんて設定できないよ〜。 ForeignKeyを設定したく無いなら、未入力(blank)を許可しなきゃね。それとは別に、参照先が無い場合(null)があるからそれは別に定義しなきゃダメだよね。 ってことなんだと思う。

今のところ自分ではすっきりしてるのでいいかな?と思ってる。