Django 5 для начинающих

Прогресс по курсу:  9/1004

8.5 Фильтрация, поиск
5 из 5 шагов пройдено

Общая фильтрация

Помимо возможности переопределения набора запросов по умолчанию, 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.


  • Комментария
Будьте вежливы и соблюдайте наши принципы сообщества. Пожалуйста, не оставляйте решения и подсказки в комментариях, для этого есть отдельный форум.
Оставить комментарий

зачем нам тут кнопка с фильтрами если API это для обращения программы? Или есть  ситуации когда через API работают люди? 

@Георгий_Тимофеев, для удобства отладки, можно получить не страницу, а чистые данные в формате json, задав параметр запроса  ?format=json.

Теперь вам следует либо добавить бэкенд фильтра в настройки:

либо лишнее 

@Георгий_Тимофеев, спасибо, исправил.

@Дмитрий_Селезнев, зря удалили, не лишнее ))

Если мы добавляем django_filters.rest_framework.DjangoFilterBackend как бэкенд по умолчанию в 'DEFAULT_FILTER_BACKENDS', то добавлять его во view уже не нужно - на то он и по умолчанию. Либо его не нужно добавлять в settings.py, но добавлять во view.

Лучше так и написать: есть 2 способа добавить бэкенд. Либо по все вью по умолчанию через settings.py, либо в каждый отдельно через атрибут filter_backends

Изменен ilya kutaev

@ilya_kutaev, Спасибо, поправил эту часть в лекции.