如何在模型上使用OrderingFilter和其他Filterset过滤

时间:2015-11-11 14:55:08

标签: django django-views django-rest-framework django-filter

我有一个模型可以说ObservedMoves。我的视图中的许多查询都引用了此模型。因此,不是在每个视图中直接应用我想要的过滤器,而是将它们抽象到过滤器类中,让我们说ObservedMovesFilters子类django_filters.Filterset并且具有元字段model = ObservedMoves

现在我想要做的是让用户在发出请求时指定排序字段。为此我打算使用DRF的OrderingFilter。如果我尝试子类化OrderingFilter类而不是Filterset类,则过滤器不起作用。如果我再次指定OrderingFilter作为默认过滤器后端,则过滤器不起作用。

在DRF文档中,唯一提供的方法是在视图内指定备用过滤器后端,并指定排序参数,但我想避免在查询该模型的每个视图中明确定义它。有没有办法做到这一点?

2 个答案:

答案 0 :(得分:7)

如果我正确理解你,你不必像其他答案那样向filter_backends添加ViewSet

您可以在settings.py文件中设置默认的过滤后端,如下所示:

REST_FRAMEWORK = {
    'DEFAULT_FILTER_BACKENDS': (
        'rest_framework.filters.DjangoFilterBackend',
        'rest_framework.filters.OrderingFilter',
    )
}

答案 1 :(得分: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',)