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