Djangoのnullの扱い方
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)があるからそれは別に定義しなきゃダメだよね。 ってことなんだと思う。
今のところ自分ではすっきりしてるのでいいかな?と思ってる。