개발 일지

ViewSet, Router

만식 2024. 5. 14. 10:40

출처 : https://www.django-rest-framework.org/tutorial/6-viewsets-and-routers/

 

6 - Viewsets and routers - Django REST framework

REST framework includes an abstraction for dealing with ViewSets, that allows the developer to concentrate on modeling the state and interactions of the API, and leave the URL construction to be handled automatically, based on common conventions. ViewSet c

www.django-rest-framework.org

 

 

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개의 메서드가 모두 구현

 

# urls.py

router = routers.DefaultRouter()

# 서로 다른 path 함수를 하나로 묶어 주는 과정
# url prefix, ViewSet
router.register('user', UserViewSet)

urlpatterns = router.urls
# ViewSet을 사용하려면 라우터에 등록하여 자동으로 URLconf가 생성되도록

 

- 로직을 하나의 클래스로 결합할 수 있음

- 라우터 사용으로 URLconf를 다룰 필요가 없음

 

* view와 url설정을 사용하면 보다 명확하고 상세해짐 

ViewSet은 빠르게 실행하거나 대규모 API가 있는 , 전체적으로 일관된 URLconf를 적용하려는 경우에 유리

 

API 

ViewSet

 class ViewSet(ViewSetMixin, views.APIView):
    """
    The base ViewSet class does not provide any actions by default.
    """
    pass
    # APIView에서 상속받으며 ViewSet 클래스는 action의 구현을 제공하지 않아 ViewSet 클래스를 사용하기 위해서는
	# 해당 클래스를 override 하고, 명시적으로 action을 정의해야함
# 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

 

ModelViewSet 클래스는 GenericAPIView를 상속하고 다수의 mixin 클래스의 동작을 혼합하여 다양한 action에 대한 구현을 포함

. list(),. retrieve(),. create(),. update(),. partial_update(),. destroy()를 제공

GenericAPIView를 상속받고 있기 때문에 기본적으로 queryset과 serializer_class 속성을 필수로 제공

 

serializer_class = UserSerializer
queryset = User.objects.all()

 

# ReadOnlyModelViewSet
class ReadOnlyModelViewSet(mixins.RetrieveModelMixin,
                           mixins.ListModelMixin,
                           GenericViewSet):
    """
    A viewset that provides default `list()` and `retrieve()` actions.
    """
    pass

ReadOnlyModelViewSet 클래스는 GenericAPIView를 상속

 오직 읽기 전용 action인. list()와. retrieve()만 제공