62.Django(장고) - ecommerce 프로젝트 - DRF - Mixins 를 이용한 예제(CRUD)

JungSik Heo·2024년 12월 19일

상속받는 클래스의 추상화(패턴화) 정도 한눈에 알아보기

  • APIView < mixins < generics APIView < ViewSet

  • APIView : 자주 쓰이는 view 들의 패턴을 패턴화 시켜 최소한의 코드로 Model 에 대한 view 를 구현하는 방법.
  • mixins : APIView 의 일반적인 로직들을 섞어 재사용성을 높임.
  • generics APIView : mixins 사용을 패턴화하여 정리.
  • ViewSet : generics APIViews 를 한번 더 합쳐서 정리.

1. Mixins 상속

APIView는 각 request method 마다 직접 serializer 처리를 해주어야되는데, 이러한 부분들이 많이 사용되면 여러 serializer에 대한 중복이 발생합니다. 따라서 rest_framework.mixins 에서는 이러한 기능들이 미리 구현이 되어 있습니다.

  • CreateModelMixin
  • ListModelMixin
  • RetrieveModelMixin
  • UpdateModelMixin
  • DestroyModelMixin

mixins 구현 예시

api\urls.py

urlpatterns = [
	생략...
    path("categories/", MixinsCategories.as_view()),#dev_52
    path("categories/<int:pk>/", MixinsCategory.as_view()),#dev_52
]

api\views.py

#dev_52
class MixinsCategories(ListModelMixin,CreateModelMixin,DestroyModelMixin,GenericAPIView):
    queryset = Category.objects.all()
    serializer_class = CategorySerializer
    
    def get(self, request, *args, **kwargs):
        return self.list(request)
        
    def post(self, request, *args, **kwargs):
        return self.create(request)

class MixinsCategory(RetrieveModelMixin, UpdateModelMixin, DestroyModelMixin, GenericAPIView):
    queryset = Category.objects.all()
    serializer_class = CategorySerializer
    
    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)

아래와 같이 CRUD를 통해 테스트

총 정리

# APIView
from rest_framework.views import APIView
class SnippetsAPIView(APIVIEW):
	def get(self, request):
		pass
	def post(self, request):
		pass

# Mixins
from rest_framework import mixins
RetrieveModelMixin : Get
ListModelMixin : Gets
CreateModelMixin : Post
UpdateModelMixin : Put
DestroyModelMixin : delete

# Generics APIView
from rest_framework import generics
generics.CreateAPIView : 생성
generics.ListAPIView : 목록
generics.RetrieveAPIView : 조회
generics.DestroyAPIView : 삭제
generics.UpdateAPIView : 수정
generics.RetrieveUpdateAPIView : 조회/수정
generics.RetrieveDestroyAPIView : 조회/삭제
generics.ListCreateAPIView : 목록/생성
generics.RetrieveUpdateDestroyAPIView : 조회/수정/삭제

# ViewSets - Router 사용해야함
from rest_framework import viewsets
viewsets.ReadOnlyModelViewSet : 목록 조회, 특정 레코드 조회 (get만 가능)
viewsets.ModelViewSet : 목록 조회, 특정 레코드 생성/조회/수정/삭제 전부 자동으로 만들어줌.
Viewsets.ViewSet : 자동으로 만들지마! 내가 다 만들께 

urls.py
from rest_framework.routers import DefaultRouter
post_router = DefaultRouter()
post_router.register('viewset',views.PostViewSet)
출처: https://jongseoung.tistory.com/220 [Today_developStory:티스토리]
profile
쿵스보이(얼짱뮤지션)

0개의 댓글