Добавьте запись для каждого вида в 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 преобразует значения в ссылки на классы.