아래 사례는 Udemy의 "The complete Guide to Django Restframework and Vue JS" 강의 중 Section4 의 : Django REST Framework - Level Two 내용으로서 Ebook API 작성사례이며, DRF 9편까지 이어집니다.
GenericaAPIVeiw Tutorial 보러 가기
GenericAPIView
에 List, Create 등 다양한 믹스인 클래스를 결합해 APIView를 구현할 수 있음GenericAPIView
는 CRUD(생성/읽기/수정/삭제)에서 공통적으로 사용되는 속성을 제공하고, Mixin은 CRUD 중 특정 기능을 수행하는 메소드를 제공함 from rest_framework import generics
from rest_framework import mixins
from ebooks.models import Ebook
from ebooks.api.serializers import EbookSerializer
class EbookListCreateAPIView(mixins.ListModelMixin,
mixins.CreateModelMixin,
generics.GenericAPIView):
queryset = Ebook.objects.all()
serializer_class = EbookSerializer
def get(self, request, *args, **kwargs):
return self.list(request, *args, **kwargs)
def post(self, request, *args, **kwargs):
return self.create(request, *args, **kwargs)
다음 속성들을 통해 View를 컨트롤함
queryset : View에서 객체를 반환하는 데 사용해야 하는 쿼리셋. 반드시 1) queryset 속성을 설정하거나, 2) get_queryset() 메서드로 override해서 사용해야 함.
serializer_class : 입력된 값을 validate하거나 deserialize하거나, 출력값을 serialize할 때 사용하는 serializer 클래스. 일반적으로 이 속성을 설정하거나 get_serializer_class()메소드로 override해서 사용해야 함
lookup_field : 개별 모델 인스턴스의 object 조회를 수행 할 때 사용해야하는 모델 필드. 기본값은 'pk'임. 하이퍼링크 된 API에 custom 값을 사용해야 하는 경우 API views와 serializer 클래스가 lookup필드를 설정해야 함.
다음 속성을 통해 리스트뷰에서 페이지네이션을 컨트롤하게 된다.
DEFAULT_PAGINATION_CLASS
(rest_framework.pagination.PageNumberPagination 모듈안에) 세팅으로 결정됨.왜 믹스인 클래스를 사용할까? 만약 Django Rest Framework Mixin을 사용하지 않다면, 모든 기능을 모든 VIew에 직접, 반복적으로 구현해야할 것이다. 하지만 API를 작업할 때 목록을 보여주거나, 생성, 삭제, 수정 등은 항상 사용되는 반복적인 일이다. 이러한 반복적인 기능을 하나의 Mixin 클래스로 제공한다면 반복적인 일을 줄여주고 가독성, 생산성을 높여줄 수 있다.
단, Mixin 클래스에 존재하는 메소드나 속성을 상속받는 클래스에서 사용할 경우 믹스인 클래스의 메소드가 오버라이딩되어 의도하지 않게 작동할 수 있으니 주의해야한다.
.list(request, *args, **kwargs)
메소드로 호출하여 사용200 OK response
리턴.create(request, *args, **kwargs)
메소드로 호출하여 사용201 Created
리턴400 Bad Request
리턴.retrieve(request, *args, **kwargs)
메소드로 호출하여 사용200 OK response
리턴404 Not Found
리턴.update(request, *args, **kwargs)
메소드로 호출하여 사용.partial_update(request, *args, **kwargs)
메소드를 호출하여야 하며, 이 때 요청은 HTTP PATCH requests
여야 함200 OK response
리턴404 Not Found
리턴.destroy(request, *args, **kwargs)
메소드로 호출하여 사용204 No Content
리턴404 Not Found
리턴View -> APIView -> GenericAPIView로 View클래스의 기능이 더 많아지는데, 각 View별로 어떤 차이점이 있는가?
Q&A)
view -> fbv
apivew -> cbv 하지만 메소드 마다 query_set / serializer를 설정해야함
genericAPIVIEW -> query_set / serializer 같이 쓸수 있음, 하지만 사용할 mixin 설정해야함
modelVIEW -> genericAPIVIEW + mixin
맞나요?