Django REST Framework(DRF)は、DjangoでWeb APIを構築するための追加ライブラリです。素のDjangoでもJSONを返すAPIは書けますが、入出力データの変換・バリデーション・認証・ページネーションを毎回手書きすると量が増えて崩れやすくなります。DRFはこの定型処理を部品化し、モデルから数十行でCRUD APIを立ち上げられます。この記事では、DRFが何を肩代わりするのか、Serializer・ViewSet・Routerによる最小構成、そして「いつDRFを使い、いつ使わないか」までを、実際のコードと最新バージョン情報つきで整理します。各部品の詳しい使い方は個別記事へ橋渡しするハブとして構成しています。
まとめ:この記事の結論
- DRFは「DjangoでREST APIを作るときの定型処理(変換・検証・認証・ページング)」を部品化するライブラリ。素のDjangoに
rest_frameworkを足して使う。 - 最小構成はSerializer(データ変換)→ ViewSet(処理)→ Router(URL自動生成)の3点セット。モデル1つならこれだけでCRUDが揃う。
- 最新は3.17.1、動作要件はDjango 4.2以上・Python 3.10以上(2026年7月時点)。
- APIの規模が中〜大、認証・権限・ドキュメントまで一貫させたいならDRF。単純で高速な小規模APIや型ヒント重視ならDjango Ninjaや素のDjangoも選択肢。
Django REST Frameworkとは:DjangoにAPI層を足すライブラリ
DRFはDjangoの上で動くWeb APIフレームワークです。読み方は「ディー・アール・エフ」。DjangoのモデルやORMをそのまま使いながら、HTTPリクエストをPythonのオブジェクトへ、Pythonのオブジェクトをレスポンス(JSONなど)へ変換する層を提供します。
DRFが肩代わりする処理
素のDjangoでAPIを書くと、リクエストボディのパース、型チェック、モデルへの保存、エラー時のレスポンス整形を毎回自前で組むことになります。DRFはこれを次の部品に分けて標準化します。
| 部品 | 担当する処理 |
|---|---|
| Serializer | 入出力データの変換とバリデーション |
| APIView / ViewSet | リクエストを受けて処理を振り分ける |
| Router | ViewSetからURLを自動生成 |
| Authentication / Permission | 認証と権限判定 |
| Renderer / Pagination | レスポンスの整形とページ分割 |
この「定型処理を部品として与える」点が、DRFを使う最大の理由です。1件のリクエストごとに検証と変換を書き直さずに済みます。
バージョンと動作要件
最新の安定版は3.17.1です(2026年7月時点。最新は公式のリリース履歴で確認してください)。動作要件はDjango 4.2以上・Python 3.10以上で、Django 5系・6系にも対応します。バージョンは変動するため、プロジェクトではrequirements.txtに固定して管理します。
最小構成でREST APIを作る
DRFの全体像は、実際に一番小さいAPIを組むと掴めます。ここではBookモデルに対するCRUD APIを、Serializer・ViewSet・Routerの3ファイルで作ります。
インストールとsettings登録
pip install djangorestframework
インストール後、settings.pyのINSTALLED_APPSにrest_frameworkを追加します。この登録を忘れるとブラウザブルAPIやページネーションの既定設定が効きません。
INSTALLED_APPS = [
# ... 既存のアプリ
"rest_framework",
]
Serializer・ViewSet・Routerをつなぐ
Serializerはモデルと入出力データの対応を宣言し、ViewSetはCRUDの処理をまとめ、Routerがそれをエンドポイントへ割り当てます。
# serializers.py
from rest_framework import serializers
from .models import Book
class BookSerializer(serializers.ModelSerializer):
class Meta:
model = Book
fields = ["id", "title", "author"]
# views.py
from rest_framework import viewsets
from .models import Book
from .serializers import BookSerializer
class BookViewSet(viewsets.ModelViewSet):
queryset = Book.objects.all()
serializer_class = BookSerializer
# urls.py
from rest_framework.routers import DefaultRouter
from .views import BookViewSet
router = DefaultRouter()
router.register(r"books", BookViewSet)
urlpatterns = router.urls
これだけで、一覧・作成・取得・更新・部分更新・削除の各操作(books/ と books/{pk}/ の2つのURL)が自動で用意されます。ModelViewSetがこれら6アクションを、DefaultRouterがURLを生成するため、ビュー関数を個別に書く必要がありません。
ブラウザブルAPIで動作を確認する
開発サーバーを起動してbooks/のパスをブラウザで開くと、DRFの「ブラウザブルAPI」が表示されます。これはDRFが標準で持つHTML画面で、フォームからPOSTやPUTを試せます。JSONだけを返したい場合は、クライアント側でAccept: application/jsonを付けるか、RendererをJSON専用に設定します。このレスポンス整形(Renderer)はDRFで調整の多い部分で、出力形式を一元管理できます。
DRFの主要コンポーネント地図
最小構成で登場した部品が、実際のプロジェクトでどこを担当するかを整理します。各部品は独立して差し替えられるため、必要な箇所だけ深掘りしてください。
Serializer:データ変換とバリデーションの中心
Serializerはモデルインスタンスと素のデータ(辞書やJSON)を相互変換し、同時に入力値の検証を行います。DRFで最も設計が分かれる部品で、ネストした関連データやカスタムバリデーションはここに集約します。フィールド定義・バリデーション・ネストの具体的な書き方は、Django REST FrameworkのSerializer(シリアライザ)とは?使い方・フィールド・バリデーション・ネストを解説で詳しく扱っています。
APIView / ViewSet:処理の受け口
ViewSetはCRUDのアクションを1クラスにまとめる高レベルな受け口で、Routerと組み合わせて使います。一方、エンドポイントごとに細かく処理を制御したいときは、より低レベルなAPIViewや関数ベースの@api_viewを選びます。定型的な資源操作はViewSet、独自ロジックが多い箇所はAPIView、という使い分けが基本です。
Router:URLの自動生成
Routerは登録したViewSetから一覧・詳細などのURLパターンを自動生成します。DefaultRouterはAPIルート一覧のページも追加し、SimpleRouterはそれを省きます。URL設計を手書きしないことで、エンドポイントの命名が統一されます。
認証とパーミッション:認証と権限の分離
DRFは認証(誰か)と権限(何をしてよいか)を分離して扱います。トークン認証・セッション認証・JWTなどをAuthentication classで、アクセス可否をPermission classで指定します。フロントエンドと分離した構成での認証実装は、ReactとDjangoを連携する方法|REST API・CORS・JWT認証の実装手順が具体例になります。
ページネーションとレスポンス整形
一覧APIは件数が増えると重くなるため、DRFはページネーションを標準で提供します。settings.pyで既定のページサイズを指定すれば、全ViewSetに一括適用できます。レスポンス形式はRendererで制御し、既定ではJSONとブラウザブルHTMLの両方を返します。大量データを返すAPIでは、あわせてDjangoとRailsにおけるN+1問題解決法の比較と考察で扱うN+1問題の対策も必要になります。
DRFを使うべき場面・避けるべき場面
DRFは万能ではありません。プロジェクトの規模と要件によっては、素のDjangoやDjango Ninjaのほうが速く仕上がります。判断基準を具体的に示します。
DRFが向くケース
認証・権限・ページネーション・APIドキュメントまで一貫した仕組みが必要な、中〜大規模のAPIならDRFが有力です。モデル駆動でCRUDを量産する管理系API、外部公開する本格的なREST API、チームで規約を揃えたい開発ではDRFの部品化が効きます。既存のDjangoプロジェクトにAPIを足す場合も、ORMや認証基盤をそのまま流用できる点が強みです。
一覧APIの絞り込みをフィルタバックエンドで受ける実装は、django-filterで一覧検索を実装する|FilterSet設計とDRF指定の判断で扱います。
素のDjangoやDjango Ninjaを選ぶケース
返すJSONが数種類だけの小さなエンドポイントなら、DRFを入れずDjangoのJsonResponseで十分なこともあります。また、型ヒントベースの記述・自動ドキュメント・非同期処理を重視するならDjango Ninjaとは何か?概要と基本情報が候補です。Django NinjaはPydanticの型定義でリクエストを検証するため、Serializerクラスを書くより記述量が少なく済む場面があります。DRFの学習コストと部品の豊富さが要件に見合うかで選び分けてください。なお、Django本体やMVTの仕組みが曖昧な場合はDjangoとは?Python製Webフレームワークの特徴・MVT・始め方を入門解説から押さえると、DRFの位置づけが理解しやすくなります。
よくある質問(FAQ)
DRFとDjangoの違いは何ですか?
Djangoはデータベース連携や管理画面まで含む総合的なWebフレームワークで、DRFはそのDjango上でWeb API(主にREST API)を作ることに特化した追加ライブラリです。DRFはDjango無しでは動かず、Djangoのモデルやビューを土台に使います。
DRFの最新バージョンと必要な環境は?
2026年7月時点の最新安定版は3.17.1で、Django 4.2以上・Python 3.10以上が必要です。バージョンは更新されるため、導入時は公式のリリース情報を確認し、requirements.txtでバージョンを固定して運用します。
DRFで最小のAPIを作るには何が必要ですか?
モデルに対するSerializer、処理をまとめるViewSet、URLを生成するRouterの3つです。ModelSerializerとModelViewSet、DefaultRouterを組み合わせれば、1モデルのCRUD APIを数十行で用意できます。
レスポンスのJSON整形はどう制御しますか?
Renderer classで制御します。既定ではJSONとブラウザブルHTMLの両方を返しますが、JSONのみに絞ったり、整形済みのレスポンス構造を統一したりできます。ページネーションの形式もあわせてsettings.pyで既定化できます。
DjangoでAPIを作るならDRFとDjango Ninjaのどちらが良いですか?
認証・権限・ページネーションまで含めて規約を揃えたい中〜大規模APIはDRF、記述量を抑えたい小〜中規模や型ヒント・非同期を重視するならDjango Ninjaが向きます。既存のDRF資産があるプロジェクトはDRF継続が無難です。