ViewSet
은 Django REST Framework에서 제공하는 강력한 기능으로, 여러 CRUD(Create, Retrieve, Update, Delete) 작업을 단일 클래스에서 처리할 수 있게 해줍니다.ViewSet
은 기본적으로 Django의 뷰와 비슷하지만, 다양한 동작(GET, POST, PUT, DELETE 등)을 하나의 클래스에서 정의할 수 있어 코드의 중복을 줄이고 간결하게 관리할 수 있습니다.
ViewSet
: 모든 CRUD 작업을 직접 정의할 수 있는 기본 ViewSet.ModelViewSet
: ViewSet
을 상속받아 모델의 CRUD 작업을 자동으로 처리합니다.ReadOnlyModelViewSet
: 읽기 전용 작업(리스트, 상세 조회)만 처리합니다.HTTP 메서드 | URL | ViewSet 메서드 | 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
은 가장 많이 사용되는 ViewSet으로, 모델의 모든 CRUD 작업을 처리합니다. queryset
과 serializer_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
은 읽기 전용 API를 제공하며, list
와 retrieve
작업만 지원합니다.
from rest_framework import viewsets
from .models import MyModel
from .serializers import MyModelSerializer
class MyModelReadOnlyViewSet(viewsets.ReadOnlyModelViewSet):
queryset = MyModel.objects.all()
serializer_class = MyModelSerializer
기본 제공되지 않는 동작이나 커스텀 동작을 추가하고 싶을 때는, 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)
Router
는 URL 라우팅을 자동으로 처리해주는 Django REST Framework의 기능입니다. ViewSet과 함께 사용하면, URL 패턴을 자동으로 생성할 수 있어 URL 설정을 간편하게 할 수 있습니다.
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
는 SimpleRouter
의 기능에 더해, 기본 API 루트 엔드포인트를 추가로 생성해줍니다.
from rest_framework.routers import DefaultRouter
from .views import MyModelViewSet
router = DefaultRouter()
router.register(r'mymodels', MyModelViewSet)
urlpatterns = router.urls
이 경우, /에 API 루트 엔드포인트가 추가되어 사용자가 어떤 엔드포인트를 사용할 수 있는지 쉽게 파악할 수 있습니다.
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을 모두 관리할 수 있습니다.