Django ViewSet

Haks.·2025년 2월 7일
0

Study

목록 보기
53/65

ViewSet

ViewSet은 Django REST Framework에서 제공하는 강력한 기능으로, 여러 CRUD(Create, Retrieve, Update, Delete) 작업을 단일 클래스에서 처리할 수 있게 해줍니다. ViewSet은 기본적으로 Django의 뷰와 비슷하지만, 다양한 동작(GET, POST, PUT, DELETE 등)을 하나의 클래스에서 정의할 수 있어 코드의 중복을 줄이고 간결하게 관리할 수 있습니다.

1. ViewSet의 종류

  • ViewSet: 모든 CRUD 작업을 직접 정의할 수 있는 기본 ViewSet.
  • ModelViewSet: ViewSet을 상속받아 모델의 CRUD 작업을 자동으로 처리합니다.
  • ReadOnlyModelViewSet: 읽기 전용 작업(리스트, 상세 조회)만 처리합니다.

2. ViewSet 사용법

Viewset URL

HTTP 메서드URLViewSet 메서드basename 기반 URL 이름
GET/restaurants/list()restaurant-list
POST/restaurants/create()restaurant-list
GET/restaurants/{id}/retrieve()restaurant-detail
PUT/PATCH/restaurants/{id}/update()restaurant-detail
DELETE/restaurants/{id}/destroy()restaurant-detail

ModelViewSet 사용법

ModelViewSet은 가장 많이 사용되는 ViewSet으로, 모델의 모든 CRUD 작업을 처리합니다. querysetserializer_class만 정의하면, 나머지 작업은 자동으로 처리됩니다.

from rest_framework import viewsets
from .models import MyModel
from .serializers import MyModelSerializer

class MyModelViewSet(viewsets.ModelViewSet):
    queryset = MyModel.objects.all()
    serializer_class = MyModelSerializer

ReadOnlyModelViewSet 사용법

ReadOnlyModelViewSet은 읽기 전용 API를 제공하며, listretrieve 작업만 지원합니다.

from rest_framework import viewsets
from .models import MyModel
from .serializers import MyModelSerializer

class MyModelReadOnlyViewSet(viewsets.ReadOnlyModelViewSet):
    queryset = MyModel.objects.all()
    serializer_class = MyModelSerializer

Custom ViewSet 사용법

기본 제공되지 않는 동작이나 커스텀 동작을 추가하고 싶을 때는, ViewSet을 직접 상속받아 필요한 메서드를 정의할 수 있습니다.

from rest_framework import viewsets
from rest_framework.response import Response

class CustomViewSet(viewsets.ViewSet):
    def list(self, request):
        data = {"message": "This is a list view"}
        return Response(data)

    def retrieve(self, request, pk=None):
        data = {"message": f"This is the detail view of {pk}"}
        return Response(data)

3. Router와 ViewSet 연결

Router 개념

Router는 URL 라우팅을 자동으로 처리해주는 Django REST Framework의 기능입니다. ViewSet과 함께 사용하면, URL 패턴을 자동으로 생성할 수 있어 URL 설정을 간편하게 할 수 있습니다.

SimpleRouter 사용법

SimpleRouter는 가장 기본적인 Router로, ViewSet과 연결하여 기본적인 CRUD URL을 자동으로 생성합니다.

python코드 복사
from rest_framework.routers import SimpleRouter
from .views import MyModelViewSet

router = SimpleRouter()
router.register(r'mymodels', MyModelViewSet)

urlpatterns = router.urls

이 코드로 인해 다음과 같은 URL 패턴이 자동으로 생성됩니다:

  • GET /mymodels/list
  • GET /mymodels/{pk}/retrieve
  • POST /mymodels/create
  • PUT /mymodels/{pk}/update
  • DELETE /mymodels/{pk}/destroy

DefaultRouter 사용법

DefaultRouterSimpleRouter의 기능에 더해, 기본 API 루트 엔드포인트를 추가로 생성해줍니다.

from rest_framework.routers import DefaultRouter
from .views import MyModelViewSet

router = DefaultRouter()
router.register(r'mymodels', MyModelViewSet)

urlpatterns = router.urls

이 경우, /에 API 루트 엔드포인트가 추가되어 사용자가 어떤 엔드포인트를 사용할 수 있는지 쉽게 파악할 수 있습니다.

Router와 기존 URL 패턴 통합

Router를 사용하면서도, 기존의 URL 패턴과 함께 사용할 수 있습니다.

from django.urls import path, include
from rest_framework.routers import DefaultRouter
from .views import MyModelViewSet, custom_view

router = DefaultRouter()
router.register(r'mymodels', MyModelViewSet)

urlpatterns = [
    path('', include(router.urls)),
    path('custom/', custom_view),
]

이렇게 하면, ViewSet으로 관리되는 URL과 개별 뷰 함수가 처리하는 URL을 모두 관리할 수 있습니다.

0개의 댓글

관련 채용 정보