Как я могу использовать OrderingFilter вместе с другими фильтрами Filterset для модели

У меня есть модель, скажем, ObservedMoves. Эта модель упоминается во многих запросах внутри моих представлений. Поэтому вместо того, чтобы применять фильтры, которые мне нужны, непосредственно внутри каждого представления, я абстрагирую их внутри класса фильтров, скажем, ObservedMovesFilters, который является подклассом django_filters.Filterset и имеет метаполе model = ObservedMoves.

Теперь то, что я хочу сделать, это позволить пользователю указать поле заказа при отправке запроса. Для этого я планирую использовать OrderingFilter DRF. Если я попытаюсь создать подкласс класса OrderingFilter вместо класса Filterset, фильтры не сработают. Если я снова укажу OrderingFilter в качестве базового фильтра по умолчанию, фильтры не будут работать.

В документации DRF единственным представленным методом является указание внутри представления альтернативной внутренней части фильтра, а также указание параметров упорядочения, но я хочу избежать явного определения его в каждом представлении, которое запрашивает эту модель. Есть ли способ сделать это?


person LetsPlayYahtzee    schedule 11.11.2015    source источник


Ответы (2)


Вы должны указать другое поле в ViewSet с именем filter_backends

filter_backends = (filters.DjangoFilterBackend,filters.OrderingFilter,)

e.g.

from rest_framework import filters
import django_filters

class UserFilter(django_filters.FilterSet):
    [...]

class UserViewSet(viewsets.ModelViewSet):
    queryset = User.objects.all()
    serializer_class = UserSerializer
    #vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
    filter_backends = (filters.DjangoFilterBackend,filters.OrderingFilter,)
    filter_class = UserFilter
    ordering = ('username',)
person Ross Rogers    schedule 11.11.2015
comment
Это частично решает проблему, поскольку мне по-прежнему приходится явно указывать серверную часть в каждом представлении или наборе представлений, но, по крайней мере, это работает. - person LetsPlayYahtzee; 13.11.2015
comment
Вероятно, вы можете создать подкласс ModelViewSet (или что-то еще) и добавить поле filter_backends, которое будет использоваться по умолчанию для ваших моделей. - person Ross Rogers; 13.11.2015

Если я правильно вас понимаю, вам не нужно добавлять filter_backends к каждому ViewSet, как сказано в другом ответе.

Вы можете просто настроить свои фильтры по умолчанию в файле settings.py следующим образом:

REST_FRAMEWORK = {
    'DEFAULT_FILTER_BACKENDS': (
        'rest_framework.filters.DjangoFilterBackend',
        'rest_framework.filters.OrderingFilter',
    )
}
person emptyflash    schedule 04.12.2015