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