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

How can I use OrderingFilter along with other Filterset filtering on a model

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

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

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

您必须在 ViewSet 上指定另一个名为 filter_backends

的字段
filter_backends = (filters.DjangoFilterBackend,filters.OrderingFilter,)

例如

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',)

如果我对您的理解正确,您不必像其他答案所说的那样向每个 ViewSet 添加 filter_backends

您可以像这样在 settings.py 文件中设置默认过滤器后端:

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