DRF / django-filter を使ってフィルタリング


はじめに

Django REST Framework で API 作成でウェブ API を作成した。この記事では、django-filter を使って、リクエストに合わせてフィルタリングを行ったレスポンスを返せるようにする。Filtering - Django REST frameworkを参考にした。動作環境は以下。

  • OS: Windows 10 Pro (WSL2 Ubuntu-20.04)
  • Python: 3.8.5
  • Django: 3.2
  • djangorestframework: 3.12.4
  • django-filter: 2.4.0

インストールおよびセットアップ

以下コマンドでインストールする。

$ pip install django-filter

さらにプロジェクトの settings.py にて 'django_filters' と 'DEFAULT_FILTER_BACKENDS' を追記する。

config/settings.py
# Application definition

INSTALLED_APPS = [
    ...
    'rest_framework',
    'django_filters',
]

REST_FRAMEWORK = {
    'DEFAULT_FILTER_BACKENDS': ['django_filters.rest_framework.DjangoFilterBackend'],
}

これで DRF を読み込んで、使用することができる。

フィルタリング

ViewSets.py にて、フィルタリングしたいフィールドを filterset_fields として指定する。ここでは、Django REST Framework で API 作成で扱った Info というモデルの、id という項目を指定する。

views.py
from .models import Info
from .serializers import InfoSerializer
from rest_framework import viewsets

class InfoViewSet(viewsets.ReadOnlyModelViewSet):
    queryset = Info.objects.all()
    serializer_class = InfoSerializer
    filterset_fields = ['id']

動作確認

ここまででフィルタリング設定が完了しているはずなので、開発用サーバーにて動作確認をするため python manage.py runserver で開発用サーバーを立ち上げる。http://localhost:8000/api/info/?id=1111111 のように id を指定してアクセスすると、フィルタリング結果が返される。また http://localhost:8000/api/info へアクセスすると、API コンソール右上に「フィルタ」という項目が追加されており、手動でフィルタリング結果を見ることもできる。

おわりに

django-filter を用いてフィルタリングを実行できた。次は React で開発したフロントエンドから API を叩いて、適切なデータを得ることを試してみる。