💡 AI 인사이트

🤖 AI가 여기에 결과를 출력합니다...

댓글 커뮤니티

쿠팡이벤트

이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.

검색

    [코담] 웹개발·실전 프로젝트·AI까지, 파이썬·장고의 모든것을 담아낸 강의와 개발 노트

    Part6 | ✅저자: 이유정(박사)

    🔹 DRF 튜토리얼 Part6 _ ViewSets & Routers

    📖 공식 문서 링크:
    🔗 https://www.django-rest-framework.org/tutorial/6-viewsets-and-routers/

    목표:

    • ViewSet 사용 CRUD 기능을 하나의 클래스에 통합
    • @action 사용 커스텀 API(예: highlight) 만들기
    • Router로 URL 자동화 urlpatterns 수동 작성 없이 자동 처리
    • API Root 자동 생성 / 경로를 자동으로 만들어 줌
    • 코드량 최소화 클래스 수와 URL 작성 수를 줄이고 API 구조를 단순화

    UserViewSet, SnippetViewSet 추가 / 기존 뷰들 제거 (SnippetList, SnippetDetail, SnippetHighlight, UserList, UserDetail, api_root)

    snippets/views.py

    from rest_framework import viewsets, permissions, renderers
    from rest_framework.decorators import action
    from rest_framework.response import Response
    from django.contrib.auth.models import User
    from snippets.models import Snippet
    from snippets.serializers import SnippetSerializer, UserSerializer
    from snippets.permissions import IsOwnerOrReadOnly
    
    
    class UserViewSet(viewsets.ReadOnlyModelViewSet):
        queryset = User.objects.all()
        serializer_class = UserSerializer
    
    
    class SnippetViewSet(viewsets.ModelViewSet):
        queryset = Snippet.objects.all()
        serializer_class = SnippetSerializer
        permission_classes = [permissions.IsAuthenticatedOrReadOnly, IsOwnerOrReadOnly]
    
        @action(detail=True, renderer_classes=[renderers.StaticHTMLRenderer])
        def highlight(self, request, *args, **kwargs):
            snippet = self.get_object()
            return Response(snippet.highlighted)
    
        def perform_create(self, serializer):
            serializer.save(owner=self.request.user)
    

    기존 뷰 분기 방식 제거 → Router 기반 URL 자동 구성으로 변경

    snippets/urls.py

    from snippets import views
    
    from django.urls import path, include
    from rest_framework.routers import DefaultRouter
    
    router = DefaultRouter()
    router.register(r'snippets', views.SnippetViewSet, basename='snippet')
    router.register(r'users', views.UserViewSet, basename='user')
    
    urlpatterns = [
        path('', include(router.urls)),
    ]
    

    기존에 수동으로 정의했던 path('snippets/...'), path('users/...'), api_root 등은 모두 제거됨

    ViewSet은 일반 뷰 클래스처럼 직접 path()로 URL을 지정하지 않습니다. 대신 router가 자동으로 GET, POST, PUT/PATCH, DELETE를 만들어 줍니다.

    TOP
    preload preload