我有一个模型可以说ObservedMoves
。我的视图中的许多查询都引用了此模型。因此,不是在每个视图中直接应用我想要的过滤器,而是将它们抽象到过滤器类中,让我们说ObservedMovesFilters
子类django_filters.Filterset
并且具有元字段model = ObservedMoves
。
现在我想要做的是让用户在发出请求时指定排序字段。为此我打算使用DRF的OrderingFilter
。如果我尝试子类化OrderingFilter
类而不是Filterset
类,则过滤器不起作用。如果我再次指定OrderingFilter
作为默认过滤器后端,则过滤器不起作用。
在DRF文档中,唯一提供的方法是在视图内指定备用过滤器后端,并指定排序参数,但我想避免在查询该模型的每个视图中明确定义它。有没有办法做到这一点?
答案 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',)