[파이썬][Django] ViewSet 및 Router 사용 방법과 예제

Django REST framework에서 ViewSet 및 Router를 사용하여 RESTful API를 구현하는 방법과 예제를 살펴보겠습니다.

ViewSet

ViewSet는 Django REST framework에서 제공하는 강력한 기능 중 하나로, 일련의 API 엔드포인트를 생성하는 데 도움을 줍니다. ViewSet은 기본적으로 모델과 연관되며, 일반적으로 CRUD(Create, Read, Update, Delete) 작업을 수행하는 API를 만들 때 사용됩니다.

예를 들어, 모델 “Post”를 다루는 API를 생성하는 ViewSet은 다음과 같이 정의할 수 있습니다:

from rest_framework import viewsets
from .models import Post
from .serializers import PostSerializer

class PostViewSet(viewsets.ModelViewSet):
    queryset = Post.objects.all()
    serializer_class = PostSerializer

위의 코드에서 PostViewSet는 모든 “Post” 객체를 가져오고, 생성, 읽기, 업데이트 및 삭제 작업을 수행하는 데 사용됩니다.

Router

Router는 ViewSet과 URL 패턴을 자동으로 연결해주는 도구입니다. Router를 사용하면 URL 패턴을 간단하게 설정할 수 있으며, 다양한 HTTP 메서드에 대한 엔드포인트를 생성할 수 있습니다.

예를 들어, Router를 사용하여 위에서 정의한 PostViewSet를 URL에 연결하는 방법은 다음과 같습니다:

from rest_framework import routers

router = routers.DefaultRouter()
router.register(r'posts', PostViewSet)

이제 posts/ 엔드포인트에 대한 API가 생성됩니다.

전체 예제

아래는 ViewSet 및 Router를 사용한 Django REST framework의 예제입니다. 이 예제에서는 “Post” 모델을 다루는 간단한 블로그 API를 생성합니다.

# models.py
from django.db import models

class Post(models.Model):
    title = models.CharField(max_length=100)
    content = models.TextField()

# serializers.py
from rest_framework import serializers
from .models import Post

class PostSerializer(serializers.ModelSerializer):
    class Meta:
        model = Post
        fields = '__all__'

# views.py
from rest_framework import viewsets
from .models import Post
from .serializers import PostSerializer

class PostViewSet(viewsets.ModelViewSet):
    queryset = Post.objects.all()
    serializer_class = PostSerializer

# urls.py
from django.urls import path, include
from rest_framework.routers import DefaultRouter
from .views import PostViewSet

router = DefaultRouter()
router.register(r'posts', PostViewSet)

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

위 코드를 사용하면 /posts/ 엔드포인트를 통해 블로그 게시물을 생성, 조회, 업데이트 및 삭제할 수 있는 API를 만들 수 있습니다. Router는 URL 패턴을 자동으로 생성하여 사용자가 API를 사용할 수 있게 합니다.