일반적으로 REST API를 구현할 때 ListAPI 와 DetailAPI 을 구현한다.
이때 List API는 GET, POST 메서드를 구현하며 Detail API는 GET, PUT, DELETE메서드를 구현한다.
DRF의 ViewSet은 2개의 URL별로 구현된 5개의 메서드를 단 하나의 클래스에 제공하며
다시 말해 하나의 헬퍼 클래스로 두 개 이상의 URL처리를 가능하게 해 준다.
ViewSet은 일반적이 api와 달리 get(), post()와 같은 메서드 핸들러는 제공하지 않으나 list(), create()와 같은 액션을 제공한다.
(단, 똑같이 Get, Post로 요청을 보내줘야 함.)
class UserViewSet(viewsets.ViewSet):
def list(self, request):
queryset = User.objects.all()
serializer = UserSerializer(queryset, many=True)
return Response(serializer.data)
def retrieve(self, request, pk=None):
queryset = User.objects.all()
user = get_object_or_404(queryset, pk=pk)
serializer = UserSerializer(user)
return Response(serializer.data)
훨씬 간결해지긴 하지만 위와 같이 본인이 작성하는 것보단 아래와 같이 기본 동작을 제공해주는 기본 클래스를 사용을 권장한다.
class UserViewSet(viewsets.ModelViewSet):
serializer_class = UserSerializer
queryset = User.objects.all()
단 2줄의 코드로 5개의 메서드가 모두 구현이 되는 것이다.
ViewSet을 사용하려면 라우터에 등록하여 자동으로 URLconf가 생성되도록 한다.
# urls.py
router = routers.DefaultRouter()
# 서로 다른 path 함수를 하나로 묶어 주는 과정
# url prefix, ViewSet
router.register('user', UserViewSet)
urlpatterns = router.urls
장점
1. 반복되는 로직을 하나의 클래스로 결합할 수 있다.
2. 라우터 사용으로 URLconf를 다룰 필요가 없다.
단, view와 url설정을 사용하면 보다 명확하고 상세해진다.
한눈에 알아볼 수 있는 코드가 되는 것이다.
그러므로 ViewSet은 빠르게 실행하거나 대규모 API가 있는 , 전체적으로 일관된 URLconf를 적용하려는 경우에 유리하다.
# API REFERENCE
1. ViewSet
class ViewSet(ViewSetMixin, views.APIView):
"""
The base ViewSet class does not provide any actions by default.
"""
pass
APIView에서 상속받으며 ViewSet 클래스는 action의 구현을 제공하지 않아 ViewSet 클래스를 사용하기 위해서는
해당 클래스를 override 하고, 명시적으로 action을 정의해야 한다.
2. GenericViewSet
class GenericViewSet(ViewSetMixin, generics.GenericAPIView):
"""
The GenericViewSet class does not provide any actions by default,
but does include the base set of generic view behavior, such as
the `get_object` and `get_queryset` methods.
"""
pass
GenericAPIView에서 상속받는다.
get_object, get_queryset 메서드와 다른 generic view의 기본 action을 제공하지만, 기본적으로는 어떤 액션도 포함하고 있지 않다.
그러므로 이도 마찬가지로 해당 클래스를 override 하고 필요한 mixin 클래스를 혼합하여 명시적으로 action을 정의해야 한다.
3. ModelViewSet
class ModelViewSet(mixins.CreateModelMixin,
mixins.RetrieveModelMixin,
mixins.UpdateModelMixin,
mixins.DestroyModelMixin,
mixins.ListModelMixin,
GenericViewSet):
"""
A viewset that provides default `create()`, `retrieve()`, `update()`,
`partial_update()`, `destroy()` and `list()` actions.
"""
pass
ModelViewSet 클래스는 GenericAPIView를 상속하고 다수의 mixin 클래스의 동작을 혼합하여 다양한 action에 대한 구현을 포함한다.
. list(),. retrieve(),. create(),. update(),. partial_update(),. destroy()를 제공한다.
GenericAPIView를 상속받고 있기 때문에 기본적으로 queryset과 serializer_class 속성을 필수로 제공해야 한다.
serializer_class = UserSerializer
queryset = User.objects.all()
기본적으로 override가 가능하다.
* 관련 포스팅은 다음 기회에^^
4. ReadOnlyModelViewSet
class ReadOnlyModelViewSet(mixins.RetrieveModelMixin,
mixins.ListModelMixin,
GenericViewSet):
"""
A viewset that provides default `list()` and `retrieve()` actions.
"""
pass
ReadOnlyModelViewSet 클래스는 GenericAPIView를 상속한다.
ModelViewSet와 비슷하지만 오직 읽기 전용 action인. list()와. retrieve()만 제공한다.
참고 및 출처:
https://dahye-jeong.gitbook.io/django/rest_framework/2019-04-22-viewset
'👩💻 개발 > ⚙️ BACKEND' 카테고리의 다른 글
[Django] DRF JWT 회원가입, 로그인 기능/ dj-rest-auth (0) | 2022.12.22 |
---|---|
[Django] DRF Method Override 방법 (1) | 2022.10.08 |
[Django] admin 계정 생성 (0) | 2022.10.08 |
[Django] related_name 설정 (0) | 2022.10.07 |
[SpringBoot/JPA] 무한 참조 및 type definition error: (simple type) 문제 (0) | 2022.08.18 |