DRF를 조금씩 공부하면서 가장 궁금했던 점이 언제 ModelViewSet을 쓰고 언제 APIView를 써야 하는지였다. 오늘 그부분에 대해 질문을 하였고 명쾌한 대답을 들었다😀
제일 큰 차이점은 URL이다.
예를 들어 게시물 api가 있다고 가정하자.
그렇다면 url은 이렇게 될 것이다.
/posts # 게시글 리스트를 불러오거나 게시글을 생성하는 url
/posts/1 # 1번 게시글을 불러오거나 수정, 삭제하는 url
만약 이렇게 CRUD + list 가 다 필요하다면 ModelViewSet 을 쓰는 것이 좋다.
ModelViewSet은 CRUD와 list를 전부 제공한다.
class PostViewSet(viewsets.ModelViewSet):
queryset = Post.objects.all()
serializer_class = PostSerializer
# GET Method ( list 를 가져옴 )
def list(self, request):
pass
# POST Method
def create(self, request):
pass
# GET Method ( 하나의 객체를 가져옴 )
def retrieve(self, request, pk=None):
pass
# PUT Method
def update(self, request, pk=None):
pass
# PATCH Method
def partial_update(self, request, pk=None):
pass
# DELETE Method
def destroy(self, request, pk=None):
pass
이렇게 queryset과 serializer_class 가 공통적인 코드를 하나의 class 에서 처리할 수 있다. 또한 Router를 통해 하나의 url로 처리가 가능하다.
#. urls.py
from django.urls import path, include
from . import views
from rest_framework.routers import DefaultRouter
router = DefaultRouter()
router.register('posts',views.PostViewSet)
urlpatterns = [
path('',include(router.urls)),
]
이렇게 구현해주면 위의
/posts # 게시글 리스트를 불러오거나 게시글을 생성하는 url
/posts/1 # 1번 게시글을 불러오거나 수정, 삭제하는 url
두 가지 url을 모두 충족하게 된다.
APIView 는 하나의 url에 대해서만 처리를 할 수 있기 때문에 굳이 두가지 url이 필요하지 않은 경우 사용한다. (UPDATE, DELETE 만 필요한 api, LIST만 필요한 api 등)