🔖

Djangoのblank=Trueとnull=Trueの違いと使い分け

に公開

はじめに

Djangoでモデルを定義しているときに、次のようなオプションを見かけます。

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

私自身、最初は blank=Truenull=True の違いがわかりませんでした。
しかし実際は、意味も適用される場所も違います

本記事では、blanknull の違いと、使い分けの考え方を解説します。

null=True とは

null=True は、テーブルのカラムに NULL を入れてもいいという意味です。

例:

summary = models.TextField(null=True)

summary カラムに 何も入れない(NULL) というレコードも保存できます。

✅ これは テーブルのカラムに対する設定です。

blank=True とは

blank=True は、Djangoのフォームや管理画面で「空欄のまま」でもOKにするという意味です。

例:

title = models.CharField(max_length=100, blank=True)

この設定があると、フォームのバリデーションチェックで空文字でもエラーになりません

✅ こちらは フォームのバリデーションに関する設定です。

用語補足

フォーム

Djangoでは、ユーザーが入力する画面(投稿・登録など)をFormクラスや ModelForm クラスで定義します。
blank=True を指定すると、その入力項目を空のまま送信できるようになります。

管理画面

Djangoには、開発者や管理者向けの 自動生成されたデータ管理ページ(Adminサイト) が用意されています。
blank=True を指定すると、管理画面の入力欄でも空欄を許容できるようになります。

使用例:モデルとフォームの関係

では、実際にモデルで blanknull を使い分けた例を見てみましょう。

モデル例

from django.db import models

class Book(models.Model):
    title = models.CharField(max_length=100)  # 必須(null=False, blank=False がデフォルト)
    subtitle = models.CharField(max_length=200, blank=True)  # 空欄OK、テーブルでは空文字""
    published_at = models.DateField(null=True, blank=True)   # 日付はNULLを許容

このモデルでは:

  • title: フォーム、テーブル共に必須
  • subtitle: フォームでは省略OK(空欄になる)、でもテーブルには ""(空文字)で保存
  • published_at: フォームで省略可能かつ、テーブルでもNULLを許容

管理画面(フォーム)との関係

上記のモデルをDjangoの管理画面に登録した場合、
subtitlepublished_at の項目は 空欄のままでも保存可能 になります。

特に blank=True がないと、
フォームで必須扱いになってしまい、空のまま保存しようとするとエラーになります。

フォームで省略を許したいなら blank=True が必要
日付や数値を未入力として扱いたいなら null=True を追加

❗️CharFieldで null=True は避けるべき理由

subtitle = models.CharField(max_length=200, null=True, blank=True)

このように書くと、subtitleNone"" も入り得る状態になります。

つまり:

  • 空文字("")
  • NULL(None)

混在する可能性があり、データ処理が煩雑になる ため、
文字列系(CharField, TextField)では null=True は避けるのが一般的 です。

組み合わせと注意点

組み合わせ 使いどころ・ポイント
null=True, blank=True 文字列以外(DateField, ForeignKeyなど)で空を許容したいとき
null=False, blank=True 文字列系(CharField, TextField)の基本的な設定
null=True, blank=False フォームでは必須扱い、一方でテーブルではNULLを許容 → 混乱しやすいため注意
null=False, blank=False フォーム、テーブルともに完全に必須項目

文字列フィールド(CharField, TextField)では null=True は基本避けましょう
空文字("")とNULLが混在すると、データ処理が煩雑になるためです。

まとめ

項目 null=True blank=True
目的 テーブルでNULLを許可する フォームで空欄を許可する
適用される場所 モデル → テーブルのカラム モデル → フォーム・管理画面のバリデーション

文字列型:blank=True のみ / 数値・日付型:null=True, blank=True の併用が基本

おわりに

blanknull は似ているようで全然違います。
特に Django のモデル設計では、この2つの違いを理解しておくことで エラーを減らし、意図した挙動にできます。

「文字列は空文字、数値や日付はNULL」のように、型ごとの使い方も意識して使い分けましょう。

本記事が、Djangoを学び始めた方の一助になれば幸いです。

Discussion