반응형
Django REST Framework의 ModelViewSet과 create() 관련 찾아보고 공부한 내용을 정리해보려고 한다.
기본적으로 ModelViewSet은 GenericAPIView라는 클래스를 상속받기 때문에 .list(), .create() .list(), .create() 등을 기본으로 내장하고 있다. 따라서 이 중에서 기본 내장되어 있는 메소드 중 동작을 변경하고 싶은 것들만 overriding해서 수정하면 된다.
그리고 ModelViewSet은 GenericAPIView를 상속받고 있기 때문에 최소한 queryset와 serializer_class는 세팅해주어야 한다.
from rest_framework import status
from rest_framework.response import Response
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()
위의 코드를 보면 이해가 조금 더 쉬울 것 같다. perform_create()은 create()의 동작 중 일부분을 overriding한다고 생각하면 되는데, serializer.save()가 호출될 때 perform_create()가 호출된다고 생각하면 된다. 위의 경우 명시적으로 perform_create()를 호출했지만, django에서는 개발자의 짐을 덜어주기위해 mixin으로 앞에서 설명한 list(), create()등을 제공하는 데, 이때 자동으로 save()대신 perform_create()를 호출하는 것이다.
만약 perform_create()가 없었다면, create()의 전체적인 로직은 변경할 필요가 없어 작성하지는 않고 mixin이 기본 제공하는 메소드를 사용할 때, save()가 될 때의 행동을 부분적으로 재정의를 하고 싶더라도 create()전체를 재작성해야될 것이다.
반응형
'백엔드' 카테고리의 다른 글
[Docker 이해하기] Docker Configuration 설정법 (0) | 2020.03.18 |
---|---|
[Django 공식문서 번역] REST Framework - Viewset and Router (0) | 2020.03.18 |
Django Channels - Introduction (0) | 2020.03.18 |
Django Channels - Consumers (0) | 2020.03.18 |
[PostgreSQL 공부하기] PostgreSQL Index는 B-Tree를 어떻게 사용할까? (1) | 2019.12.23 |