- List -> get/post
- Detail -> get/(put이나 patch)/ delete
CreateModelMixin -> List의 post
ListModelMixin -> List의 get
RetrieveModelMixin -> Detail의 get
UpdateModelMixin -> Detail의 put이나 patch
DestoryModelMixin -> Detail의 delete
class CreateModelMixin:
"""
Create a model instance.
"""
def create(self, request, *args, **kwargs):
serializer = self.get_serializer(data=request.data)
serializer.is_valid(raise_exception=True)
self.perform_create(serializer)
headers = self.get_success_headers(serializer.data)
return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers)
def perform_create(self, serializer):
serializer.save()
def get_success_headers(self, data):
try:
return {'Location': str(data[api_settings.URL_FIELD_NAME])}
except (TypeError, KeyError):
return {}
from rest_framework import generics
from rest_framework import mixins
class PostListAPIView(mixins.ListModelMixin, mixins.CreateModelMixin,
generics.GenericAPIView):
queryset = Post.objects.all()
serializer_class = PostSerializer
def get(self, request, *args, **kwargs):
return self.list(request, *args, **kwargs)
def post(self, request, *args, **kwargs):
return self.create(request, *args, **kwargs)
GenericAPIView를 상속 받을때에는 무조건 가장 뒤에 와야 한다.
상속으로 ListModelMixin과 CreateModelMixin을 받았다.
ListModelMixin을 통해 list라는 멤버함수가 생긴다.
CreateModelMixin을 통해 create라는 멤버함수가 생긴다.
그래서 해당 코드에 self.list와 self.create가 상속을 받아서 생기는 멤버함수이다.
위에서 말했듯이, mixin 클래스 내에서는 해당 http 메소드에 맞게 매핑해주는 로직이 없다.
그렇기 때문에 위의 코드처럼 직접 매핑 시켜줘야한다.
인자들을 받은 그대로 넘겨줘야하는데, 매번 이렇게 연결해주려니 너무 불편하다.
다음 예시도 보자.
from rest_framework import generics
from rest_framework import mixins
class PostDetailAPIView(mixins.RetrieveModelMixin, mixins.UpdateModelMixin,
mixins.DestroyModelMixin, generics.GenericAPIView):
queryset = Post.objects.all()
serializer_class = PostSerializer
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)
이것도 마찬가지로 각 mixin을 상속 받은 것에 맞는 멤버함수들이 생긴다.
RetrieveModelMixin -> retrieve
UpdateModelMixin -> update
DestroyModelMixin -> delete
이것도 매번 매핑 시켜주기 번거롭다.
from rest_framework import generics
class PostListAPIView(generics.ListCreateAPIView):
queryset = Post.objects.all()
serializer_class = PostSerializer
# rest_framework/generics.py
class ListCreateAPIView(mixins.ListModelMixin,
mixins.CreateModelMixin,
GenericAPIView):
def get(self, request, *args, **kwargs):
return self.list(request, *args, **kwargs)
def post(self, request, *args, **kwargs):
return self.create(request, *args, **kwargs)
from rest_framework import generics
class PostDetailAPIView(generics.RetrieveUpdateDestroyAPIView):
queryset = Post.objects.all()
serializer_class = PostSerializer
# rest_framework/generics.py
class RetrieveUpdateDestroyAPIView(mixins.RetrieveModelMixin,
mixins.UpdateModelMixin, mixins.DestroyModelMixin,
GenericAPIView):
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 patch(self, request, *args, **kwargs):
return self.partial_update(request, *args, **kwargs)
def delete(self, request, *args, **kwargs):
return self.destroy(request, *args, **kwargs)