0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【初心者向け】djangoのview(Class-based view、Function-based view、DRF)の違いについて、例を使いながら簡単にまとめてみた

Posted at

はじめに

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の役割にプラスして、ロジックを書くこともあります。
image.png

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がシンプルで効率的
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?