수학과의 좌충우돌 프로그래밍

[Django] filtering 과 Search 본문

웹프로그래밍/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 조건절을 통해 검색을 하게 되며, 아래의 이미지와 같이 검색을 할 수 있습니다.

 

Comments