[DRF] <Level Two> Django REST Framework - 2. The GenericAPIView Class & Mixins를 통한 APIViews 작성

Alex of the year 2020 & 2021·2020년 9월 2일
0

Django Rest Framework

목록 보기
6/15
post-thumbnail

GenericAPIView & Mixins

GenericAPIViews

"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에 세팅되는 속성이다.

queryset

View에서 객체를 반환하는 데 사용해야 하는 쿼리셋

1) queryset 속성을 설정하거나
2) get_queryset() 메서드로 override하여
사용해야 함.

serializer_class

입력된 값을 validate, 혹은 deserialize하거나
출력값을 serialize할 때 사용하는 serializer 클래스

1) serializer_class 속성을 설정하거나
2) get_serializer_class()메소드로 override해서 사용해야 함

lookup_field

개별 모델 인스턴스의 object 조회를 수행 할 때 사용해야하는 모델 필드로 기본값은 'pk'.
하이퍼링크 된 API에 custom 값을 사용해야 하는 경우, API views와 serializer 클래스가 lookup필드를 설정해야 함.


만약 이런 GenericAPIViews로 내가 원하는 API를 만들 수 없다면,
1) regular APIView 클래스로 원하는 기능을 구현하거나
2) 아래의 mixins를 GeneralAPIView에 섞어 내가 원하는대로 구현하면 된다.


Mixins

GenericAPIViews와 보통 함께 쓰이는 클래스. 이름 그대로 좀 더 발전된 기능의 구현을 위해 섞어 사용하게 되는 것. Mixin Classes는 .list(), .create()등의 action methods를 제공한다.
(참고: .get(), .post(), .patch(), .put() 등은 handler methods라고 한다.)
mixins는 rest_framework.mixins.를 임포트하여 사용한다.
대표적인 mixins 클래스 다섯 개를 살펴보자.

ListModelMixin

  • queryset을 리스팅하는 역할..list(request, *args, **kwargs) 메소드를 호출하여 사용한다.
  • 성공 시, 200 OK + response (body: 직렬화된 쿼리셋을 담아) 리턴
  • 옵션 설정 시, paginated 될 수 있다.

CreateModelMixin

  • 모델 인스턴스를 생성하고 저장하는 역할. .create(request, *args, **kwargs) 메소드를 호출하여 사용한다.
  • If the representation contains a key named url, then the Location header of the response will be populated with that value.
  • 성공 시, 201 Created + response (body: 직렬화된 쿼리셋을 담아)
  • 실패 시, 400 Bad Request + response (body: error details) 리턴

RetrieveModelMixin

  • 존재하는 모델 인스턴스를 리턴해주는 역할. .retrieve(request, *args, **kwargs) 메소드를 호출하여 사용한다.
  • 성공 시, 200 OK + response (body: 직렬화된 쿼리셋을 담아)
  • 실패 시, 404 Not Found 리턴

UpdateModelMixin

  • 존재하는 모델 인스턴스를 수정하고 저장하는 역할. .update(request, *args, **kwargs) 메소드를 호출하여 사용한다.
  • .partial_update(request, *args, **kwargs) 메소드로 호출하는 경우는 HTTP PATCH 메소드와 함께 요청이 보내어지며, 부분 수정을 원할 때에 사용.
  • 성공 시, 200 OK + response (body: 직렬화된 객체를 담아)
  • 실패 시, 400 Bad Request + response (body: error details) 리턴

DestroyModelMixin

  • 존재하는 모델 인스턴스를 삭제하는 역할. .destroy(request, *args, **kwargs) 메소드를 호출하여 사용한다.
  • 성공 시, 204 No Content
  • 실패 시, 404 Not Found 리턴

Code

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

profile
Backend 개발 학습 아카이빙 블로그입니다. (현재는 작성하지 않습니다.)

0개의 댓글