Добавьте запись для каждого вида в DEFAULT_FILTER_BACKENDS

В проекте Django (и DRF) с большим количеством представлений мы задали список бэкендов фильтров в settings.py:

REST_FRAMEWORK = {
    "DEFAULT_FILTER_BACKENDS": [
        # filter backend classes
    ],
    # other settings
}

Некоторым классам представлений нужны дополнительные бэкенды фильтров. Мы можем указать атрибут filter_backends для каждого класса представления:

FooViewSet(viewsets.ModelViewSet):
    filter_backends = [DefaultFilterOne, DefaultFilterTwo, DefaultFilterThree, AdditionalFilter]

Однако это не DRY. В данном примере три (3) бэкенда фильтров используются по умолчанию и должны повторяться в классе набора представлений. Если в settings.py произойдет изменение, оно должно быть отражено в классе представления.

Какова наилучшая практика добавления дополнительного бэкенда фильтрации для каждого класса, сохраняя при этом бэкенды фильтрации по умолчанию из settings.py?

Благодаря подсказке от @LiorA я решил эту проблему. Вот как я это сделал:

from rest_framework.settings import api_settings
from rest_framework import viewsets


class FooViewSet(viewsets.ModelViewSet):
    filter_backends = api_settings.DEFAULT_FILTER_BACKENDS + [AdditionalFilter]

Здесь api_settings.DEFAULT_FILTER_BACKENDS получает запись "DEFAULT_FILTER_BACKENDS" из REST_FRAMEWORK в settings.py. В то время как записи в настройках представляют собой пути в виде строк, api_settings преобразует значения в ссылки на классы.

Вернуться на верх