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

Let*_*zee 2 django django-views django-filter django-rest-framework

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

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

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

emp*_*ash 7

如果我的理解是否正确,你不必添加filter_backends到每个ViewSet喜欢对方的回答说.

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

REST_FRAMEWORK = {
    'DEFAULT_FILTER_BACKENDS': (
        'rest_framework.filters.DjangoFilterBackend',
        'rest_framework.filters.OrderingFilter',
    )
}
Run Code Online (Sandbox Code Playgroud)


Ros*_*ers 4

您必须在ViewSet被叫方上指定另一个字段filter_backends

filter_backends = (filters.DjangoFilterBackend,filters.OrderingFilter,)
Run Code Online (Sandbox Code Playgroud)

例如

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',)
Run Code Online (Sandbox Code Playgroud)