안녕세계

[장고 AtoZ] Django REST Framewrok - ViewSet(Custom) 본문

[장고 AtoZ] Django REST Framewrok - ViewSet(Custom)

Junhong Kim 2018. 2. 6. 14:44
728x90
반응형

안녕하세요!

이번 포스팅에서는 특정 엔드포인트를 Custom 해보도록 하겠습니다.


우리가 지난 포스팅에서 만들어 두었던 PostViewSet에 두가지 메서드를 추가할건데요 ㅎㅎ

첫번째는 'django'라는 이름을 포함하고있는 데이터를 불러올 수 있도록 params를 쓰지않고 작업을할 거고.

두번째는 특정 post 메시지를 수정하는 작업을 해볼 겁니다.


[blog/views.py]

from rest_framework import viewsets
from rest_framework.decorators import detail_route, list_route
from rest_framework.response import Response

from .models import Post
from .serializers import PostSerializer


class PostViewSet(viewsets.ModelViewSet):
queryset = Post.objects.all()
serializer_class = PostSerializer

# HTTP GET /blog/post/
# HTTP GET /blog/post/?search=
def get_queryset(self):
qs = super().get_queryset()

search = self.request.query_params.get('search', '')
if search:
qs = qs.filter(message__icontains=search)

return qs

# HTTP GET /blog/post/get_django/
@list_route()
def get_django(self, request):
qs = self.get_queryset().filter(message__icontains='django')
serializer = self.get_serializer(qs, many=True)
return Response(serializer.data)

# HTTP PATCH /blog/post/{pk}/set_modified
@detail_route(methods=['patch'])
def set_modified(self, request, pk):
instance = self.get_object()
instance.message = instance.message + '(modified)'
instance.save()
serializer = self.get_serializer(instance)
return Response(serializer.data)


이번에 추가된 사항은 get_django와 set_modified인데요 각각 하나씩 봐보도록 하겠습니다.


get_django API

- ModelViewSet에 @list_route() 데코레이터를 명시하면

/prefix/함수명/  => 즉, /blog/post/get_django/ 로 GET요청이 가능합니다.

(methods를 미지정시에는 default로 GET 요청이 됩니다.)


이후 get_django 함수 안에서 원하는 작업을 작성한 뒤, qs(=querySet의 약자)를 반환 받은뒤 qs를 serialize 합니다.

이후 우리는 Response() 에 데이터를 담아 전달하면 다음과 같은 결과를 얻을 수 있습니다.



/bog/post/get_django/  과 /blog/post/?search= 는 동일한 작업을 하지만 URL이 다르다는 것이 보이시죠?

현재는 예시를 위해 간단한 작업을 만들기 위해 동일한 작업으로 구성한것이고,

앞으로 여러분이 API를 만들 때 원하는 URL로 만들 수 있다는 것을 보여주기 위함이었습니다! ㅎㅎ


그럼 다음 두번째

set_django API

- 마찬가지로, ModelViewSet 메서드에 @detail_route()를 명시한 뒤 methods를 지정하면

해당 URL로 해당 요청을 받으면 수행할 작업입니다.

@detail_route()에서는 데코레이션에 명시된 것처럼 각 하나의 데이터에 대한 작업을 수행할 때 사용합니다.

/prefix/{pk}/함수명 => 즉, /blog/post/{pk}/set_modified/가 됩니다.


현재는 PATCH 요청으로 되어있기에 PATCH 요청으로 위 URL로 요청하면 원하는 결과를 얻을 수 있습니다.

(@detail_rotue() 도 method를 지정하지 않으면 기본적으로 GET 요청을 합니다.)


브라우저에서는 GET요청만 가능하므로,

이번에는 PostMan을 활용하여 PATCH 요청을 보내 보도록 하겠습니다.

Response message 가 변경되 었습니다.



다시 /blog/post/ 에 GET 요청을 하니, 변경된 사항이 잘 보이네요.



이처럼 DRF에서 Custom API를 만들기 위해서는 @list_rotue()와 @detail_route() 를 잘활용하시면 됩니다!

다음 포스팅에서는 지금 보다 더 유연한 기능을 제공하는 DRF의 APIView에 대해서 알아보도록 하겠습니다.

감사합니다.


728x90
반응형
Comments