REST 프레임워크의 generic list views 는 모델에 대한 전체 쿼리 집합을 반환합니다. 종종 API가 반환하는 항목을 제한하고 싶을 때 Fitering 이 필요할 것입니다.
APIView 에서 조건에 따른 필터링이 필요할 때가 있습니다. (ex. QuerSet 의 filter/exclude) APIView 는 CBV의 일종이므로 필터링에 필요한 인자 참조를 사용할 수 있습니다.
APIView | @api_view | meaning |
---|---|---|
self.request.user | request.user | 현재 로그인 중인 유저에 접근 |
self.request.Get | request.GET | 요청한 get 인자 흭득 |
self.request.query_params | request.params | GET 과 동일. 가독성이 좀 더 좋음 |
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
DRF의 rest_framework.filters
에서는 기본 Django Admin 의 search 와 유사한 기능을 제공하고 있습니다. 이는 별도의 검색엔진을 사용한 것이 아닌, DBMS의 조건절을 활용한 것입니다.
# 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 정렬을 지정
더 자세한 검색을 위해 다음과 같은 문자열 패턴 지정을 이용할 수 도 있습니다. 이는 get_search_fields
함수로도 구현이 가능합니다.