Django

[django/drf]Djang Rest Framwork 공식문서 튜토리얼3 (Class-based Views)

a-몬드 2022. 7. 12. 12:06
반응형

함수 기반 views 대신에, 클래스 기반 views로 만들 수 있다. 

클래스 기반은 공통 기능을 다시 사용할 수 있는 강력한 패턴이다. 그리고 우리의 코드를 다시 사용하지 않게 도와준다.

 

 ✅ 현재 함수 Views => 클래스 Views 바꾸기

#snippets/views.py
from snippets.models import Snippet
from snippets.serializers import SnippetSerializer
from django.http import Http404
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status

# 클래스 기반 views.py
class SnippetList(APIView):

    def get(self, request, format=None): # get 메소드, snippet  목록 조회
        snippets = Snippet.objects.all()# DB에서 snippet목록 가져오기
        serializer = SnippetSerializer(snippets, many=True) # json으로 변환
        return Response(serializer.data)

    def post(self, request, format=None): # post메소드, snippet 추가(insert)
        serializer = SnippetSerializer(data=request.data) # 입력받은 데이터 serializer
        if serializer.is_valid(): # 입력받은 값이 유효하면
            serializer.save() # 저장해라
            return Response(serializer.data,status=status.HTTP_201_CREATED)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) # 값이 유효하지 않아서 저장안됐어~!

snippet 조회, 변경, 삭제

class SnippetDetail(APIView): # pk의 snippet 조회, 변경, 삭제 class

    def get_object(self, pk):# 유효성 검사 : 요청 보낸 pk의 snippet이 db에 있는 데이터인지 확인
        try:
            return Snippet.objects.get(pk=pk) # 해당 pk의 snippet db에서 가져오기
        except Snippet.DoesNotExist: # db에 없는 값이면 except
            raise Http404

    def get(self, request, pk, format=None):# get 메소드, pk snippet 조회
        snippet = self.get_object(pk) # 유효성 검사
        serializer = SnippetSerializer(snippet) # 유효성 검사할때 가져왔던 snippet serializer하기
        return Response(serializer.data)

    def put(self, request, pk, format=None): # pk snippet 변경
        snippet = self.get_object(pk) # 유효성 검사
        serializer = SnippetSerializer(snippet, data=request.data) # 입력받은 데이터로 serializer
        if serializer.is_valid():# 입력받은 데이터가 유효하면
            serializer.save() # 저장해라
            return Response(serializer.data)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) #입력 받은 데이터가 유효하지가 않아(뭔가 이상함;)

    def delete(self, request, pk, format=None): # pk snippet 삭제
        snippet = self.get_object(pk) # 유효성 검사
        snippet.delete() # 유효성 검사 통과했으니 삭제
        return Response(status=status.HTTP_204_NO_CONTENT) # 삭제 완료 알림

urls.py도 class 기반으로 바꿔줘야한다.

#snippets/urls.py
from django.urls import path
from rest_framework.urlpatterns import format_suffix_patterns
from snippets import views

urlpatterns = [
    path('snippets/', views.SnippetList.as_view()),# 함수기반을 class기반으로 바꿔줌
    path('snippets/<int:pk>/', views.SnippetDetail.as_view()),
]

#format_suffix_patterns 추가하기
urlpatterns = format_suffix_patterns(urlpatterns)

 

참조

https://www.django-rest-framework.org/tutorial/3-class-based-views/

반응형