학습주제
시리얼라이저와 뷰 Maxin
학습내용
지난시간에는 APIView를 상속받은 클래스를 이용해서 구현해보았다. 클래스를 이용할 경우 코드가 정돈되는 장점이 있지만 더 큰 장점은 Django REST framework에서 제공하는 다양한 클래스들을 활용해서 코드를 작성할 필요없이 쉽게 뷰를 만들 수있다.
mixins과 generics 뷰를 사용한다.
from rest_framework import status, mixins, generics
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달러 주고 구독했다. 최대한 뽑아먹어봐야겠다. 확실히 무료보다 처리속도가 빠르고 정갈하다.