フィルタとソート


フィードバック機能付き完全なPython/張庫Webサービス開発ガイド受講総括の記事.
APIが応答データを提供する場合、フィルタリングおよびソートが必要になる場合があります.
rest_framework.API viewでフィルタが提供するフィルタクラスを指定することで、必要に応じてフィルタとソートを行うことができます.
これにより、検索機能の実現が簡素化される.
今回のリリースでは、DRFで使用するフィルタの使い方について説明します.
1. Filtering
  • リストクエリAPIVviewは、条件に従ってフィルタリングする必要があります.(例えば、ex.QuerySetでのフィルタリング/除外)
  • APIViewもClass Based Viewです.
  • フィルタに必要なパラメータを参照してください
    APIView@api_viewself.request.userrequest.userself.request.GETrequest.GETself.request.query_params(GETと同じ)request.query params(GETと同じ)self.kwargs関数のキーワードパラメータ
    1.1. 直接フィルタの例→ListAPI viewでget querysetが再定義されます
    from rest_framework import generics
    
    class PostListAPIView(generics.ListAPIView):
        queryset = Post.objects.all()
    
        def get_queryset(self):
            q = self.request.query_params.get('q', '')
            qs = super().get_queryset()
            if q:
                qs = qs.filter(title__icontains=q) # 적절히 필터링
            return qs
    1.2. Generic Filtering/Ordering
    Django Adminのような検索機能を提供→個別の検索エンジンではなくDBMSの条件をフル活用
    from rest_framework.filters import SearchFilter, OrderingFilter
    
    class PostModelViewSet(viewsets.ModelViewSet):
        queryset = Post.objects.all()
        serializer_class = PostSerializer
    
        filter_backends = [SearchFilter, OrderingFilter]
        search_fields = ['message'] # ?search= -> QuerySet 조건 절에 추가할 필드 지정. 모델 필드 중에 문자열 필드만을 지정.
        ordering_fields = ['id'] # ?ordering= -> 정렬을 허용할 필드의 화이트 리스트. 미지정 시에 serializer_class에 지정된 필드들.
        ordering = ['id'] # 디폴트 정렬을 지정
  • SearchFilter:search fieldsに基づいてwhere条件セクションを実行
  • OrderingFilter:Ordering fields、Orderingを参照
  • Ordering fields、そうでなければすべてのフィールドをソートできます.
  • [http://locahost:8000/post/search=수정&ordering=-id](http://locahost:8000/post/search=수정&ordering=-id):id降順で「修正」を含む記事を並べます.
  • search_fieldssearch_fields = ['=username', '=email']
  • アレイ文字列
  • "^": Starts-with search
  • "=": Exact matches
  • "@": Full-text search. (単語/フレーズを検索し、長い間MySQLバックエンドでのみ提供-2020年2月現在)
  • "$": Regex search
  • →get search fields関数も実現可能