Djangoのblank=Trueとnull=Trueの違いと使い分け
はじめに
Djangoでモデルを定義しているときに、次のようなオプションを見かけます。
title = models.CharField(max_length=100, blank=True, null=True)
私自身、最初は blank=True と null=True の違いがわかりませんでした。
しかし実際は、意味も適用される場所も違います。
本記事では、blank と null の違いと、使い分けの考え方を解説します。
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 を指定すると、管理画面の入力欄でも空欄を許容できるようになります。
使用例:モデルとフォームの関係
では、実際にモデルで blank と null を使い分けた例を見てみましょう。
モデル例
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の管理画面に登録した場合、
subtitle や published_at の項目は 空欄のままでも保存可能 になります。
特に blank=True がないと、
フォームで必須扱いになってしまい、空のまま保存しようとするとエラーになります。
✅ フォームで省略を許したいなら blank=True が必要
✅ 日付や数値を未入力として扱いたいなら null=True を追加
❗️CharFieldで null=True は避けるべき理由
subtitle = models.CharField(max_length=200, null=True, blank=True)
このように書くと、subtitle に None も "" も入り得る状態になります。
つまり:
- 空文字("")
- 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 の併用が基本
おわりに
blank と null は似ているようで全然違います。
特に Django のモデル設計では、この2つの違いを理解しておくことで エラーを減らし、意図した挙動にできます。
「文字列は空文字、数値や日付はNULL」のように、型ごとの使い方も意識して使い分けましょう。
本記事が、Djangoを学び始めた方の一助になれば幸いです。
Discussion