【DRF】views.pyで「APIview」と「modelViewSet」どっちを使う?違いがよく分からない。

DjangoでAPIを作る時などにviews.py内で「generics.◯◯APIView」や「viewsets.ModelViewSet」を使っていたのですが、あまり内容を理解していなかったので「結局どっちを使ったらいいのか」を中心に調べてみました。

またそれぞれの違いや使い方もメモとして残しておきます。

結論:どちらを使っても問題なさそう

少し調べた結論としては、機能的には「どちらを使っても問題ない」という印象を受けました。APIviewもModelViewSetもあらゆる操作や認証制限などは一通りできるようです。

ただし、CRUDを作成する場合は「ModelViewSet」が手っ取り早いかもしれません。後述します。

調べる中でより詳しく違いが見つかり次第更新していきます。(詳しい方もしあれば教えてください…)

APIView と ModelViewSetの2つの違い

大きなわかりやすい違いはこの2つかなと感じました。

URLを自分で決められるかどうか

ModelViewSet」は、あらかじめ操作ごとのエンドポイント(URI)が決められています。「APIView」はそれぞれ自分で定めることができて自由度が高いんですね。

CRUDを1つのクラスで作成できるかどうか

ModelViewSet」はCRUDを作成する場合は1つのクラスで作成することができます。一方「APIView」はCRUDの全操作ができるビュークラスがないので、2つ以上のクラスを書く必要があるためコード量が少し増えてしまうという点があります。

「APIView」の種類・書き方

APIViewの種類できること
ListAPIView一覧取得(GET)
RetrieveAPIView詳細取得(GET)
CreateAPIView作成(CREATE)
UpdateAPIView更新(PATCH)
DestroyAPIView削除(DELETE)
APIViewの種類できること
ListCreateAPIView一覧取得、作成
RetrieveUpdateAPIView詳細取得、更新
RetrieveDestroyAPIView詳細取得、削除
RetrieveUpdateDestroyAPIView詳細取得、更新、削除

書き方の例

from rest_framework import generics
from .models import Post
from .serializers import PostSerializer


class PostList(generics.ListCreateAPIView):
    queryset = Post.objects.all()
    serializer_class = PostSerializer
from api.views import PostList

urlpatterns = [
    path('post-list/', PostList.as_view(), name='post-list'),
    ...,
]

「ModelViewSet」の種類・書き方

ModelViewSetの種類できること
ModelViewSet一覧取得、詳細取得、作成、更新、削除
ReadOnlyModelViewSet一覧取得、詳細取得

書き方の例

from rest_framework import viewsets
from .models import Post
from .serializers import PostSerializer


class PostViewSet(viewsets.ModelViewSet):
    queryset = Post.objects.all()
    serializer_class = PostSerializer
from rest_framework import routers
from api.views import TaskViewSet


router = routers.DefaultRouter()
router.register('posts', PostViewSet, basename='posts')

urlpatterns = [
    ...,
]

コメントを残す

*