Django モデルのフィールドのnullとblankの違いや使い分ける方法

モデルのフィールドにnull=Trueや blank=Trueを設定できますが、フィールドの種類や用途によってどう使えば良いか分からなくなる事がありました。

今回はnullとblankの違いや、nullとblankの設定を使い分ける方法について解説します。

nullとblankについて

null

Trueの場合、DBにNULLを許容する様に設定します。デフォルトはFalseです。

blank

Trueの場合、空文字を許容します。デフォルトは False です。

blank=False の場合、フィールドの入力は必須になります。

nullとblankの違い

nullはDBに関連する設定であるのに対し、blankはバリデーションに関連する設定である点が異なります。

nullとblankの設定方法の違いについて

nullとblankの設定方法は計4つあります。それぞれのパターンについて簡単に解説します。

null=False, blank=False

値の入力が必須です。空文字は入力できません。

null=True, blank=True

空文字もNULLも許容します。

欠損値を空文字とNULLの2通りで設定可能(冗長な表現)なので、CharFieldやTextFieldなどの文字列ベースのフィールドでは非推奨の設定です。

しかし一意の制約をつけて未入力を許可する場合は以下の様にします。

models.CharField(max_length=100, unique=True, blank=True, null=True)

null=False, blank=True

欠損値を許容する場合、文字列ベースのフィールドで推奨される設定です。

空の文字列を欠損値として使用します。

null=True, blank=False

”入力必須だが、NULLを許容する”という意味になります。

この設定を使う機会は滅多にありません。

使用例

nullとblankのよく使う設定方法を、必須入力と、任意入力に分けて紹介します。

必須入力の例

# 文字列系
models.CharField(max_length=100)

# 数値、日付系
models.DateTimeField()

# bool系
models.BooleanField()

デフォルトはnull=False, blank=Falseであり、必須入力になります。

任意入力の例

# 文字列系
models.CharField(max_length=100, blank=True)

# 数値、日付系
models.IntegerField(null=True, blank=True)
models.DateTimeField(null=True, blank=True)

# bool系
models.BooleanField(null=True)

文字列系

入力がなかった場合は空文字として登録されます。

数値、日付系

ユーザーは未入力でも問題ないですが、システム側で未入力チェックを行い、未入力ならNoneやデフォルト値を設定する処理が必要です。
Form機能を使った場合、未入力のデータをcleanするとNoneに変換されます。

bool系

bool型でもNULLを許容できますが、基本的にはnull=Falseにして、trueかfalseのどちらかを設定した方が良いと思います。

補足

モデルのフィールドに入力制限をつける以外にも、フォーム側で入力制限をつけることも可能です。

モデルのフィールドに制限をつけすぎると柔軟性が失われるため、要件を確認して適切に設定しましょう。

スポンサーリンク
スポンサーリンク