Общая фильтрация
Помимо возможности переопределения набора запросов по умолчанию, DRF также включает поддержку общих бэкендов фильтрации, которые позволяют легко создавать сложные поиски и фильтры.
Общие фильтры также могут быть представлены в виде элементов управления HTML в просматриваемом API и API администратора.
Библиотека django-filter включает класс DjangoFilterBackend, который поддерживает высоконастраиваемую фильтрацию полей для DRF.
Чтобы использовать DjangoFilterBackend, сначала установите django-filter.
pip install django-filter
Затем добавьте 'django_filters' в INSTALLED_APPS Django:
INSTALLED_APPS = [
...
# API new
'rest_framework',
'blog_api.apps.BlogApiConfig',
'django_filters',
]
Теперь нам нужно добавить бэкенд фильтра с помощью нашего представления PostList, добавив следующие строки:
from django_filters.rest_framework import DjangoFilterBackend # new
class PostList(generics.ListCreateAPIView):
queryset = Post.objects.all()
serializer_class = PostSerializer
filter_backends = [DjangoFilterBackend] # new
filterset_fields = ['author'] # new
Если вы хотите использовать бэкэнд django-filter по умолчанию, добавьте его в настройку DEFAULT_FILTER_BACKENDS.
REST_FRAMEWORK = {
"DEFAULT_PERMISSION_CLASSES": [
"rest_framework.permissions.AllowAny",
],
'DEFAULT_FILTER_BACKENDS': ['django_filters.rest_framework.DjangoFilterBackend'] # new
}
Если вам нужна простая фильтрация на основе равенства, вы можете установить атрибут filterset_fields для представления или набора представлений, перечислив набор полей, по которым вы хотите фильтровать. Давайте проверим:
Мы видим что у нас появилась кнопка Filters, нажав на которую мы увидим окно с выбором пользователя.
Как мы видим все прекрасно работает.
Для более сложных требований к фильтрации вы можете указать класс FilterSet, который должен использоваться представлением.
Подробнее о FilterSet вы можете прочитать в документации по django-filter.
Также рекомендуется прочитать раздел Интеграция DRF.