はじめに
djangoでviewを定義する際に混ざりがちな、
・Class-based view(以下、CBV)
・Function-based view(以下、FBV)
・Django REST framework(以下、DRF)
について比較しながら、それぞれの使い方・使い分け方法を理解していきたいと思います。
結論
3つとも代表的なviewの書き方である。
それぞれの用途や使い分けは以下の通り。
| 名称 | 適した用途 | 特徴 |
|---|---|---|
| FBV | 小規模画面、柔軟な処理 | 関数ベースでわかりやすく、自由度が高い |
| CBV | フォーム画面、複雑な画面設計 | クラスベースで再利用性◎、拡張もしやすい |
| DRF | JSON API、外部連携、SPA通信 | API設計に最適。ViewSet + Routerで自動化 |
そもそも「view」ってなに?
細かい話に移る前に、djangoの全体像からviewの役割を見ていきます。
djangoの全体像は大きく以下図のようになっていて、MVCモデルに当てはめるとviewはcontrollerの位置にいることがわかりますね。
(djangoとMVCモデルのviewがややこしいですが、「djangoのviewはcontrollerの役割を、djangoのtemplateはviewの役割を持っている」と考えていただければ間違いないです)
djangoは「ビジネスロジックをmodelに集中させる」という概念を持っていないので、viewsはcontrollerの役割にプラスして、ロジックを書くこともあります。

1. FBV(Function-based view)
「関数」で定義するビューのことです。
# views.py
from django.http import HttpResponse
def hello_view(request):
return HttpResponse("Hello, world!")
# urls.py
from django.urls import path
from .views import hello_view
urlpatterns = [
path('hello/', hello_view),
]
メリット
- とにかくシンプルで、簡単かつ直感的に使えること。
- 小さな処理や単純なGET処理であれば助長なコードを書かなくて済む。
- 自由に実装できるため、アプリが複雑なロジックを持つ場合でも実装可能。
デメリット
- 大きい処理だとコード量が増え、追いづらくなる。
- 再利用・拡張性が低い。
2. CBV(Class-based view)
「クラス」でビューを定義し、as_view() を通じてURLに紐づけます。
# views.py
from django.views import View
from django.http import HttpResponse
class HelloView(View):
def get(self, request):
return HttpResponse("Hello from class!")
# urls.py
from django.urls import path
from .views import HelloView
urlpatterns = [
path('hello/', HelloView.as_view()),
]
メリット
- GET/POST をメソッド毎に区切ることができ、整理しやすい。
- djangoが用意する汎用ビュー(ListView,CreateViewなど)が優秀。
- Mixinで再利性にも優れている。
デメリット
- djangoが用意する機能を多く使うため、処理の流れが見えにくい。
- 便利である反面、抽象的なコード記述になり最初のハードルが高い。
3. DRF(Django REST framework)
DjangoでJSONベースのAPIを構築するための専用ライブラリ。
APIView や ViewSet を使うと、API処理をきれいに構造化できます。
ちなみに使うにはインストールが必要です。
pip install djangorestframework
APIViewとは
DjangoのCBV(クラスベースビュー)をベースにしたREST API用のクラスビュー。
GET,POST,PUT,DELETE などのメソッドを自分で定義します。
# views.py
from rest_framework.views import APIView
from rest_framework.response import Response
class HelloAPI(APIView):
def get(self, request):
return Response({"message": "Hello API"})
# urls.py
from django.urls import path
from .views import HelloAPI
urlpatterns = [
path('api/hello/', HelloAPI.as_view()),
]
ViewSetとは
ViewSetは、CRUD処理(Create, Read, Update, Delete)をまとめて自動で管理するためのビュークラスです。
ルーティングには通常の path() ではなく、router を使います。
# views.py
from rest_framework.viewsets import ModelViewSet
from .models import Task
from .serializers import TaskSerializer
class TaskViewSet(ModelViewSet):
queryset = Task.objects.all()
serializer_class = TaskSerializer
# urls.py(Routerで自動生成)
from rest_framework.routers import DefaultRouter
from .views import TaskViewSet
router = DefaultRouter()
router.register(r'tasks', TaskViewSet)
urlpatterns = router.urls
メリット
- APIエンドポイントを簡潔に定義可能
- 認証、シリアライザ、バリデーションなども自動処理可能
- モバイルアプリやSPAと相性◎
デメリット
- DRFの独自ルールに慣れる必要がある
- HTMLページ表示には向いていない
使い分け
| 要件 | 選ぶべきView | 理由 |
|---|---|---|
| とにかく早く作りたい、単純な画面 | FBV | 関数ベースで直感的、1ファイルで完結 |
| 再利用・拡張性を考慮したい | CBV | 継承やMixinで構造化しやすい |
| 外部アプリやSPAとJSONで連携したい | DRF | API専用で認証やバリデーションも対応 |
まとめ
いかがでしたでしょうか?
いずれのviewにもメリット・デメリットがありましたね。
極論ですが「FBVだけで全部実装する!」といったことも可能ではあります。
にもかかわらずCBVやDRFなどが用意されていることには、それなりの理由があります。
「ViewSetでの高速開発」や「チーム開発時の保守性」などを考慮して、プロジェクトの要件にあった実装をしていくと理想的なアプリケーションに近づくことができます。
ただ、最初から全部使い分けしようとどうしても難しいので、筆者としてはFBVでpython,djangoに慣れていき、徐々にCBV・DRFを取り入れていくことを推奨します。
本記事を読んでいただいた後に各viewの概要やイメージが湧き、少しでも開発の手助けになっていれば幸いです。
最後まで読んでいていただき、ありがとうございました!!
おまけ
RESTfulとは
「RESTという設計ルールに従っているWeb API」のことで、あくまで「思想」や「設計スタイル」のことを指します。
(RESTを深堀すると「Webの基本ルール(HTTP)を最大限に活用したシンプルな設計思想」であるといえます)
内容が濃いので省略しますが、ざっくり以下のようなルールがあります。
- URLが「データそのもの」を表している
- 操作はHTTPメソッド(GET,POSTなど)で区別
- クライアント・サーバー分離に伴い、表示と処理が分離されていること
- セッション情報は保持せず、データのキャッシュが可能
例:
GET /users/ ← ユーザー一覧
POST /users/ ← ユーザー作成
GET /users/1/ ← ID=1のユーザー情報
FBVとCBVの使い分け
Todoアプリを例にして、実務でよく使われる使い分けを以下にまとめます。
具体的なアプリをイメージしながら当てはめていくことで、より理解を深められると思います。
| 機能 | 使うview | 理由 | |
|---|---|---|---|
| FBV | タスク一覧表示 | ListView (CBV) | DjangoがListViewを用意していて楽。HTML表示中心 |
| CBV | タスクの詳細表示 | DetailView (CBV) | 決まった形なのでCBVが最適 |
| DRF | タスクの作成 | CreateView (CBV) | フォーム処理と保存を自動化できる |
| FBV | タスクの編集 | UpdateView (CBV) | 上に同じくフォームとバリデーションをお任せ |
| CBV | タスクの削除 | DeleteView (CBV) | 削除後のリダイレクト処理も含めて楽 |
| DRF | API:現在のタスク数を返す | FBV | 数行で済む処理なのでFBVがシンプルで効率的 |