반응형
함수 기반 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/
반응형
'Django' 카테고리의 다른 글
[django/drf]Djang Rest Framwork 공식문서 튜토리얼2 (Requests and responses) (0) | 2022.07.12 |
---|---|
[django/drf]Djang Rest Framwork 공식문서 튜토리얼1(Serialization) (0) | 2022.07.11 |
[django/error]ValueError: Dependency on app with no migrations: (한 줄로 끝내는 error) (0) | 2022.06.02 |
[Redis/Memcached]Cache 란? django settings.py에 Cache 설정하는 법(Redis 영업 글) (2) | 2022.05.27 |
[django]WSGI 란?(CGI, WSGI,AWGI) (0) | 2022.05.24 |