안녕세계
[장고 AtoZ] Django REST Framewrok - ViewSet(Custom) 본문
[장고 AtoZ] Django REST Framewrok - ViewSet(Custom)
Junhong Kim 2018. 2. 6. 14:44안녕하세요!
이번 포스팅에서는 특정 엔드포인트를 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에 대해서 알아보도록 하겠습니다.
감사합니다.
'Server > Django' 카테고리의 다른 글
[장고 AtoZ] Django REST Framework - FBV(@api_view) (0) | 2018.02.08 |
---|---|
[장고 AtoZ] Django REST Framework - CBV(APIView) (0) | 2018.02.07 |
[장고 AtoZ] Django REST Framewrok - ViewSet(Params) (0) | 2018.02.06 |
[장고 AtoZ] Django REST Framewrok - ViewSet (0) | 2018.02.06 |
[장고 AtoZ] settings.py 파일 분할 (0) | 2018.02.05 |