ViewSet list의 super() 메서드 파헤치기

2018. 5. 6. 23:18개발을 파헤치다/Django

반응형
#viewsets.py

def list(self, request, *args, **kwargs):
# 사용자 로직을 처리한다
return super().list(request, *args, **kwargs)

REST API의 GET 요청에 응답하는 ViewSet의 list 메서드를 예시로 든 것입니다.

Django의 철학은 “기본적인 것들 모두 제공할테니 필요한 로직만 구현하라”라고 볼 수 있습니다.

그렇기 때문에 Django와 Django REST Framework를 잘 사용하면 뛰어난 개발 생산성을 발휘할 수 있습니다.

하지만 위의 말처럼 Django를 최대한 활용하기 위해서는 기본으로 제공해주는 것들을 잘 활용할 수 있어야 합니다.

super() 메서드는 POST 필드값 검증, Serializer를 통한 Model 생성 및 수정, 사용자에게 전해줄 Response 생성, 페이징까지 모두 내부적으로 처리합니다.

즉, 위의 여러가지 내용들을 직접 다 코딩할 필요 없이 super()에서 제공하는 메서드를 사용하면 되는 것입니다.

하지만 제공해주는 것을 사용할 때의 문제점은 사용자 마음대로 로직을 구현하기 어려워진다는 것입니다.

DRF를 사용할 때 super() 메서드를 잘 활용한다면 위의 문제를 슬기롭게 해결할 수 있습니다.

위의 super() 메서드는 내부적으로 다음과 같은 처리들이 들어갑니다.

self.queryset = self.paginate_queryset(self.queryset)   # 페이징 처리를 수행합니다
serializer = Review_Serializer(self.queryset, many=True)
return self.get_paginated_response(serializer.data) # 페이징된 데이터를 HTTP 응답으로 만듭니다

만약 최종 응답(HTTP Response)에 대해 수정이 필요하다면 다음과 같이 수정을 할 수 있습니다.

#views.py

def list(self, request, *args, **kwargs):
# super() 메서드를 통해 POST 필드값 검증, 페이징이 적용된 결과를 받습니다
# 결과는 HTTP Response로 만들어집니다
response = super().list(request, *args, **kwargs)

# 만약 사용자에게 보낼 응답에 추가하고 싶은 데이터가 있으면 수정할 수 있습니다
# Response 객체의 data는 Ordered Dict 형태로 되어있으며 여기에 조회한 데이터 목록이 포함되어 있습니다
# 이 부분에 update 메서드를 활용하여 추가하고 싶은 데이터를 넣을 수 있습니다
response.data.update({"added_data":'new_data'})
return response



위의 그림은 Response 객체의 속성값들을 나타낸 것입니다.

data 속성에 조회한 데이터의 목록이 들어있습니다.

Ordered Dict 형태이고 수정할 수 있기때문에

update 메서드를 사용한다면 원하는 데이터를 추가하고 사용자에게 응답으로 보내줄 수 있습니다.

반응형