TIL125. DRF:Filteringの使用


📌 Django Rest FrameworkのFilterの使い方をまとめました。

🌈 Filteringの使用


🔥 Django FilterBackendのfilterst fieldsの使用方法 🔥 SearchFilterのsearch fieldsの使用方法 🔥 OrderFilterのOrdering Fieldsの使用方法

1.Djangogo FilterBackendのFilterset Fieldsの使用方法


✔django filterをインストールし、以下のように設定します.pyにインストールされているdjango-filterを登録します.
$ > pip install django-filter

✔django filterはフィルタ機能を提供するクラスのパッケージです.
# Application definition INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'rest_framework', 'django_filters', # 👈 django-filterの登録 'cbvApp', ]

✔️ settings.pyのREST FRAMEWORKでグローバル指定フィルタを設定するか、ビューごとにフィルタを指定できます.
各ビューで指定するには、Django FilterBackendをインポートし、次のようにクラスにfilter backends、filterst fieldsを指定します.
from rest_framework import viewsets from rest_framework.pagination import LimitOffsetPagination from django_filters.rest_framework import DjangoFilterBackend from fbvApp.models import Student from fbvApp.serializers import StudentSerializer # StudentPagination class StudentPagination(LimitOffsetPagination): default_limit = 4 # StudentViewSet class StudentViewSet(viewsets.ModelViewSet): queryset = Student.objects.all() serializer_class = StudentSerializer pagination_class = StudentPagination filter_backends = [DjangoFilterBackend] # 👈 Django FilterBackendの指定 filterset_fields = ['name', 'score'] # 👈 フィルタ機能を使用するフィールドを入力

✔¥以下に示すように、Filtersボタンが表示され、filterst fieldsで定義されたフィールドがフォーム形式で表示されます.
✔query parameterは、該当するフィールド名を使用してエンドポイントに貼り付けるかどうかを確認できます.

2.search fieldsの使い方


✔search fields指定したフィルタを使用して、queryパラメータに変換されたすべての値を検索し、結果を返します.
✔検索Filter機能はrest frameworkのフィルタに内蔵されています.
✔勘定科目はfilter backendsでSearchFilterを指定し、search fieldsにターゲットフィールドを入力します.
from rest_framework import viewsets from rest_framework.pagination import LimitOffsetPagination from rest_framework import filters # 👈 フィルタのインポート from fbvApp.models import Student from fbvApp.serializers import StudentSerializer # StudentPagination class StudentPagination(LimitOffsetPagination): default_limit = 4 # StudentViewSet class StudentViewSet(viewsets.ModelViewSet): queryset = Student.objects.all() serializer_class = StudentSerializer pagination_class = StudentPagination filter_backends = [filters.SearchFilter] # 👈 フィルタにSearchFilterを割り当てる search_fields = ['id', 'score'] # 👈 検索を適用するフィールドの指定

query parameter(search)が渡す値を指定したフィールドに代入してフィルタします.

1000 qeuryパラメータを使用して渡された値をフィルタする場合、以下のオプションを使用してより効率的にフィルタできます.
'^' : starts-with search '=' : exact matches '@' : full-text search '$' : regax search

# exmaple search_fields = ['=id', '^score']

3.OrderFilterのOrdering Fieldsの使い方


✔OrderFilterもrest frameworkに組み込まれたフィルタリング技術で、データのソートに使用できます.
✔ordery fieldsが指定されていない場合は、すべてのフィールドをソートターゲットとして使用できます.通常、ordery fieldsを指定することで使用されます.
✔¥もqueryパラメータで、注文方式は注文でOKです.
from rest_framework import viewsets from rest_framework.pagination import LimitOffsetPagination from rest_framework import filters # 👈 OrderFilteringもフィルタに含まれています。 from fbvApp.models import Student from fbvApp.serializers import StudentSerializer # StudentPagination class StudentPagination(LimitOffsetPagination): default_limit = 4 # StudentViewSet class StudentViewSet(viewsets.ModelViewSet): queryset = Student.objects.all() serializer_class = StudentSerializer pagination_class = StudentPagination filter_backends = [filters.OrderingFilter] # 👈 OrderingFiltingの指定 ordering_fields = ['name', 'score'] # 👈 ソートするフィールドの指定 ordering = ['id'] # 👈 Defaultソート基準の指定

✔orderingという名前のqueryパラメータでソート基準を要求した場合は、ソートを実行して戻ります.
✔query parameterがない場合は、オーダーのdefault指定値に従ってソートしてデータを返します.