フィルタとソート
フィードバック機能付き完全な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が再定義されます
Django Adminのような検索機能を提供→個別の検索エンジンではなくDBMSの条件をフル活用SearchFilter:search fieldsに基づいてwhere条件セクションを実行 OrderingFilter:Ordering fields、Orderingを参照 Ordering fields、そうでなければすべてのフィールドをソートできます. search_fieldsアレイ文字列 "^": Starts-with search "=": Exact matches "@": Full-text search. (単語/フレーズを検索し、長い間MySQLバックエンドでのみ提供-2020年2月現在) "$": Regex search →get search fields関数も実現可能
APIが応答データを提供する場合、フィルタリングおよびソートが必要になる場合があります.
rest_framework.API viewでフィルタが提供するフィルタクラスを指定することで、必要に応じてフィルタとソートを行うことができます.
これにより、検索機能の実現が簡素化される.
今回のリリースでは、DRFで使用するフィルタの使い方について説明します.
1. Filtering
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/OrderingDjango 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'] # 디폴트 정렬을 지정
[http://locahost:8000/post/search=수정&ordering=-id](http://locahost:8000/post/search=수정&ordering=-id)
:id降順で「修正」を含む記事を並べます.search_fields = ['=username', '=email']
Reference
この問題について(フィルタとソート), 我々は、より多くの情報をここで見つけました https://velog.io/@joje/필터링-Filtering과-정렬-Orderingテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol