(DRF) Filtering

duo2208·2022년 2월 3일
0

Django

목록 보기
19/23
post-thumbnail
post-custom-banner
🚀 (DRF API Guide) Filtering
REST 프레임워크의 generic list views 는 모델에 대한 전체 쿼리 집합을 반환합니다. 종종 API가 반환하는 항목을 제한하고 싶을 때 Fitering 이 필요할 것입니다.

Filtering


APIView 에서 조건에 따른 필터링이 필요할 때가 있습니다. (ex. QuerSet 의 filter/exclude) APIView 는 CBV의 일종이므로 필터링에 필요한 인자 참조를 사용할 수 있습니다.

필터링에 필요한 인자 참조

APIView@api_viewmeaning
self.request.userrequest.user현재 로그인 중인 유저에 접근
self.request.Getrequest.GET요청한 get 인자 흭득
self.request.query_paramsrequest.paramsGET 과 동일. 가독성이 좀 더 좋음
self.kwargs함수의 키워드 인자URL Capture 인자 흭득

+ 예시) 직접 필터링

ListAPIView 에서는 get_queryset 재정의를 통하여 filtering 할 수 있습니다.

# views.py
""" author 가 1인 경우만 필터링되어 리스트에 보입니다. """

from rest_framework.viewsets import ModelViewSet
from .serializers import PostSerializer
from .models import Post

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



Generic Filtering / Ordering


DRF의 rest_framework.filters 에서는 기본 Django Admin 의 search 와 유사한 기능을 제공하고 있습니다. 이는 별도의 검색엔진을 사용한 것이 아닌, DBMS의 조건절을 활용한 것입니다.

+ 예시) Generic Filtering / Ordering

# views.pt

from rest_framework.filters import SearchFilter
from rest_framework.viewsets import ModelViewSet
from .serializers import PostSerializer
from .models import Post

class PostViewSet(ModelViewSet):
	queryset = Post.objects.all()
 	serializer_class = PostSerializer
    
    filter_backends = [SearchFilter, OrderingFilter]
    search_fields = ['title']	# ?search= : QuerySet 조건절에 추가할 필드 지정. 모델 필드 중에 문자열만을 지정
    # ordering_fields = 	    # ?ordering : 정렬을 허용할 필드의 화이트 리스트. 미지정 시에 serializer_class 에 지정된 필드들.
    ordering = ['created_at']	# default 정렬을 지정

+ search_fields

더 자세한 검색을 위해 다음과 같은 문자열 패턴 지정을 이용할 수 도 있습니다. 이는 get_search_fields 함수로도 구현이 가능합니다.

  • "^" : Start-with search
  • "=" : Exact matches
  • "@" : Full-text search
  • "$" : Full-text search
  • "$" : Regex search

📌 참고 출처

post-custom-banner

0개의 댓글