웹프로그래밍/DRF
[Django] filtering 과 Search
ssung.k
2019. 12. 29. 23:14
목록을 조회하는 ListAPIVIew 에서 필터링하는 방법에 대해서 알아보도록 하겠습니다.
이는 CBV 의 일종이기 때문에 CBV와 익숙하시다면 쉽게 하실 수 있을 겁니다.
여러 인자 획득
filtering 을 하는데 필요한 인자들을 request 를 통해서 획득할 수 있습니다.
-
self.request.user
- 현재 로그인 중인 유저에 접근할 수 있습니다.
- 로그인이 안 되어 있을 시에는 AnnoymousUser 인스턴스를 획득합니다.
-
self.request.GET
- 요청한 get 인자들을 획득합니다.
-
self.request.query_params
self.request.GET
와 같은 값을 얻습니다.- 보다 더 가독성이 높기 때문에 DRF 에서 지원하고 있습니다.
-
self.kwargs
-
URL Capture 된 인자를 획득합니다.
urlpatterns = [ path('post/', views.PostListAPIView.as_view()), path('post/<int:pk>/',views.PostDetailAPIView.as_view()), ]
다음과 같이 URL 이 정의되어있는 경우에
localhost:8000/post/1/
다음 url로 접근 시 다음과 같은 값을 획득할 수 있습니다. 이는 python dictionary 로서 key 값으로 value 값에 접근이 가능합니다.self.kwargs # {'pk': '1'}
-
get_queryset
get_queryset
인자를 커스튬해서 상황에 따라 filtering을 할 수 있습니다.
# views.py
from rest_framework.viewsets import ModelViewSet
from .models import Post
from .serializers import PostSerializer
class PostViewSet(ModelViewSet):
queryset = Post.objects.all()
serializer_class = PostSerializer
def get_queryset(self):
qs = super().get_queryset()
qs = qs.filter(author=1)
return qs
위의 경우, author가 1인 경우만 filtering되어 나타나게 됩니다.
Search
admin 페이지를 커스튬하다보면 search 기능을 추가할 수 있습니다.
이 처럼 RDF 에서도 search 를 추가할 수 있습니다.
# views.py
from rest_framework.viewsets import ModelViewSet
from rest_framework.filters import SearchFilter
from .models import Post
from .serializers import PostSerializer
class PostViewSet(ModelViewSet):
queryset = Post.objects.all()
serializer_class = PostSerializer
filter_backends = [SearchFilter]
search_fields = ['title']
DBMS 의 LIKE/ILIKE 조건절을 통해 검색을 하게 되며, 아래의 이미지와 같이 검색을 할 수 있습니다.