터칭 데이터

장고(Django) Generic API View 본문

장고 (Django)

장고(Django) Generic API View

터칭 데이터 2023. 11. 4. 20:42

 

 

 

 

 

 

우리가 지난 시간 Mixins를 사용하며 작성한 polls_api/views.py의 코드 입니다.

 

from django.shortcuts import render, get_object_or_404
# from rest_framework.decorators import api_view
from polls.models import Question
from .serializers import QuestionSerializer
from rest_framework.response import Response
from rest_framework import status, mixins, generics
from rest_framework.views import APIView
# Create your views here.

class QuestionList(mixins.ListModelMixin, mixins.CreateModelMixin, generics.GenericAPIView):
    queryset = Question.objects.all()
    serializer_class = QuestionSerializer
    
    def get(self, request, *args, **kwargs):
        return self.list(request, *args, **kwargs)
    
    def post(self, request, *args, **kwargs):
        return self.create(request, *args, **kwargs)

class QuestionDetail(mixins.RetrieveModelMixin, mixins.UpdateModelMixin, mixins.DestroyModelMixin, generics.GenericAPIView):
    queryset = Question.objects.all()
    serializer_class = QuestionSerializer
    
    def get(self, request, *args, **kwargs):
        return self.retrieve(request, *args, **kwargs)
    
    def put(self, request, *args, **kwargs):
        return self.update(request, *args, **kwargs)
    
    def delete(self, request, *args, **kwargs):
        return self.destroy(request, *args, **kwargs)

 

 

여기서 generics를 이용해 더 줄일 수 있습니다.

 

 

 

 

polls_api/views.py 에서 generics를 이용해 코드를 줄인 결과물 입니다.

from polls.models import Question
from .serializers import QuestionSerializer
from rest_framework import generics
# Create your views here.

class QuestionList(generics.ListCreateAPIView):
    queryset = Question.objects.all()
    serializer_class = QuestionSerializer

class QuestionDetail(generics.RetrieveUpdateDestroyAPIView):
    queryset = Question.objects.all()
    serializer_class = QuestionSerializer

 

어떻게 이런게 가능할까요?

 

우리가 지난 시간에 mixins를 사용할 때는 list(), create(), retrieve(), update(), destroy()를 전부 적어줬었는데요. 이번에는 class를 만들 때 상속을 generics.ListCreateAPIView로 list()와 create() 메서드를 대체하고, generics.RetrieveUpdateDestroyAPIView로 retrieve(), update(), destroy() 메서드를 대체했기 때문입니다.

 

 

 

만약 여기서 여러분이 destroy(delete)를 별도로 커스터 마이즈해서 구현하고 싶다면 generics.~ 에서 Destroy가 없는 클래스를 상속받아 구현하시면 됩니다.