"Django’s generic views... were developed as a shortcut for common usage patterns... They take certain common idioms and patterns found in view development and abstract them so that you can quickly write common views of d ata without having to repeat yourself."
APIView 클래스의 연장인 GenericAPIView 클래스는 정말 많은 유용한 메소드들과 attributes를 가지고 있다. 많은 개발자들이 사용하는 흔한 코드들을 장고가 ready-to-use code로 제공해 놓은 라이브러리를 사용하는 것이라고 생각해도 좋다. Reinventing the wheel every time would be a waste of time!
위의 사진이 GenericAPIView의 예시인데, queryset, serializer_class, permission_classes는 기본적으로 GenericAPIViews에 세팅되는 속성이다.
View에서 객체를 반환하는 데 사용해야 하는 쿼리셋
1) queryset 속성을 설정하거나
2) get_queryset() 메서드로 override하여
사용해야 함.
입력된 값을 validate, 혹은 deserialize하거나
출력값을 serialize할 때 사용하는 serializer 클래스
1) serializer_class 속성을 설정하거나
2) get_serializer_class()메소드로 override해서 사용해야 함
개별 모델 인스턴스의 object 조회를 수행 할 때 사용해야하는 모델 필드로 기본값은 'pk'.
하이퍼링크 된 API에 custom 값을 사용해야 하는 경우, API views와 serializer 클래스가 lookup필드를 설정해야 함.
만약 이런 GenericAPIViews로 내가 원하는 API를 만들 수 없다면,
1) regular APIView 클래스로 원하는 기능을 구현하거나
2) 아래의 mixins를 GeneralAPIView에 섞어 내가 원하는대로 구현하면 된다.
GenericAPIViews와 보통 함께 쓰이는 클래스. 이름 그대로 좀 더 발전된 기능의 구현을 위해 섞어 사용하게 되는 것. Mixin Classes는 .list()
, .create()
등의 action methods를 제공한다.
(참고: .get()
, .post()
, .patch()
, .put()
등은 handler methods라고 한다.)
mixins는 rest_framework.mixins.
를 임포트하여 사용한다.
대표적인 mixins 클래스 다섯 개를 살펴보자.
.list(request, *args, **kwargs)
메소드를 호출하여 사용한다..create(request, *args, **kwargs)
메소드를 호출하여 사용한다. .retrieve(request, *args, **kwargs)
메소드를 호출하여 사용한다. .update(request, *args, **kwargs)
메소드를 호출하여 사용한다. .partial_update(request, *args, **kwargs)
메소드로 호출하는 경우는 HTTP PATCH 메소드와 함께 요청이 보내어지며, 부분 수정을 원할 때에 사용..destroy(request, *args, **kwargs)
메소드를 호출하여 사용한다.1) ebooksapi/ebooks/api/views.py
from rest_framework import generics
from rest_framework import mixins
from ebooks.models import Ebook, Review
from ebooks.api.serializers import EbookSerializer, ReviewSerializer
class EbookListCreateAPIView(mixins.ListModelMixin,
mixins.CreateModelMixin,
# ListCreateAPIView라는 점을 감안하여
# ListModelMixins와 CreateModelMixin을 섞어서 사용하는 것!
# 그리고 이들은 generics.ListCreateAPIView 상속보다 먼저 앞에 명시한다.
generics.ListCreateAPIView):
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)
2) ebooksapi/ebooks/api/urls.py
from django.urls import path
from ebooks.api.views import EbookListCreateAPIView
urlpatterns = [
path('ebooks/', EbookListCreateAPIView.as_view(), name='ebook-list')
]
3) ebooksapi/ebooksapi/urls.py
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('api/', include('ebooks.api.urls')),
4) python manage.py runserver
5) 127.0.0.1:8000/api/ebooks/ 로 들어가면
Ebook의 List를 볼 수 있으면서도 아래 모델 인스턴스를 Create할 수 있는 페이지가 렌더된다.
(EbookListCreateAPIView)
references:
https://www.django-rest-framework.org/api-guide/generic-views/#generic-views
https://velog.io/@jcinsh/DRF-6-GenericView%EC%99%80-Mixin