Mixin

data_hamster·2023년 4월 29일
0
post-custom-banner

학습주제
시리얼라이저와 뷰 Maxin

학습내용

지난시간에는 APIView를 상속받은 클래스를 이용해서 구현해보았다. 클래스를 이용할 경우 코드가 정돈되는 장점이 있지만 더 큰 장점은 Django REST framework에서 제공하는 다양한 클래스들을 활용해서 코드를 작성할 필요없이 쉽게 뷰를 만들 수있다.

mixins과 generics 뷰를 사용한다.
from rest_framework import status, mixins, generics

Mixin

QuestionList에서 여러 클래스를 다중상속 받는데
mixins.ListModelMixin = get에서 활용
mixins.CreateModelMixin = post에서 활용

마지막으로 generics.GenericAPIView를 활용한다.

class QuestionList(mixins.ListModelMixin, mixins.CreateModelMixin, generics.GenericAPIView):
	queryset = Question.objects.all()
    serializer_class = QuestionSerializer

이렇게만 해주면 클래스내에 메소드로 serializer를 생성하고, 수정하는 등의 코드를 작성하지 않아도 된다. 대신 메소드의 받는 인자와 return 값의 변화가 있다.

    def get(self, request, *args, **kwargs):
        return self.list(self, *args, **kwargs)

args, kwagrs 패킹을 사용하였다. return시 클래스 내 메소드 list를 호출하는데 넘겨주는 인자로 (self, *args, **kwargs)에서 왜 저렇게 넘겨주는지 몰라 Chat-GPT한테 계속 반복해서 세부적으로 알려달라고 요청했다. 우리는 저 kwargs는 딕셔너리이다. list도 정의받기를 **kwargs를 받기로 했다고 되어있을 것이다. 이에, list에게 값을 넘겨줄 때 딕셔너리 1개를 넘기는 것이 아닌, key=1, key2=3.... 이 형태를 그대로 넘겨주는 것이다. 이 말이 이해가 안돼 한참을 헤맸다. Chat-Gpt가 처음 질문에 답을 시원하게 해주지 않는 경우도 종종 있었지만, 계속 질문하다보면 내가 원하는 대답에 상당히 근접하게 대답해준다. 구글링을 하지 않아도 돼 정말 편리하다.

    def post(self, request, *args, **kwargs):
        return self.create(request, *args, **kwargs)

.create() 메소드는 mixins.CreateModelMixin에 구현되어 있다.

미리 구현되어있는 Mixin을 써서, .list, .create메소드를 써서 간단하게 구현이 가능하다. *args, **kwargs에 알아서 값이 넘어간다.

다음은 QuestionDetail도 변경해준다. 상속을 3개 받는다
mixins.RetrieveModelMixin = get 기능
mixins.UpdateModelMixin = update 기능
mixins.DestroyModelMixin = delete 기능
generic.GenericAPIView = 구현기능

class QuestionDetail(mixins.RetrieveModelMixin, mixins.UpdateModelMixin, mixins.DestroyModelMixin, generics.GenericAPIView):
    queryset = Question.objects.all()
    serializer_class = QuestionSerializer

    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는 대부분의 작업에서 반복되는 작업이다보니, 이를 mixins에서 아에 다 구현을 해놨다. 이 mixin을 활용하면 간단하게 구현 가능

urls.py로 이동
path('question/<int:pk>/', QuestionDetail.as_view(), name='question_detail'),
여기서 id를 pk로 바꾸어주어야 한다. generiAPIView에선 pk를 통해서 하나하나 값을 찾아오기 때문.

Chat-GPT 월 20달러 주고 구독했다. 최대한 뽑아먹어봐야겠다. 확실히 무료보다 처리속도가 빠르고 정갈하다.

profile
반갑습니다 햄스터 좋아합니다
post-custom-banner

0개의 댓글