
프로젝트에서 Django REST Framework를 사용하고 있는데, serializer나 viewset을 사용할 때, 특히 ModelViewSet 을 override할 때 HTTP 메소드에 따른 함수를 수정하고 싶을 때가 있다.
그럴 때 특정 분기에 따라 override하기 전의 클래스 메소드를 사용하고 싶은 때가 있다.
예시는 다음과 같다.
# ViewSet 안의 메소드
def destroy(self, request, *args, **kwargs):
user_id = int(self.kwargs.get('pk'))
# 로그인한 사용자와 조회하려는 사용자의 ID가 일치한지 확인
if self.request.user.id == user_id:
return super(UserViewSet, self).destroy(request, *args, **kwargs)
else:
response = {
'detail': 'Delete function is not offered without authorization as the owner.'}
return Response(response, status=status.HTTP_403_FORBIDDEN)
아무튼 예시에 간략하게 설명을 덧붙이자면, 다음과 같다.
destroy 함수는 DRF의 ModelViewSet 를 상속한 클래스인 UserViewSet 내의 함수이다.destroy 함수를 override하여 새로운 기능을 제공하고자 한다./users/:pk)의 pk 부분, 즉 조회하려는 사용자의 ID가 일치하는지를 확인한다.super() 를 이용하여 기존 destroy 함수를 호출해 해당 사용자를 DB에서 삭제한다.permission_classes를 작성해야 한다.
퍼가요~