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的文档中,唯一提供的方法是在视图内部指定备用过滤器后端,并指定排序参数,但我希望避免在查询该模型的每个视图中明确定义它.有没有办法做到这一点?
如果我的理解是否正确,你不必添加filter_backends到每个ViewSet喜欢对方的回答说.
您可以在settings.py文件中设置默认的过滤后端,如下所示:
REST_FRAMEWORK = {
'DEFAULT_FILTER_BACKENDS': (
'rest_framework.filters.DjangoFilterBackend',
'rest_framework.filters.OrderingFilter',
)
}
Run Code Online (Sandbox Code Playgroud)
您必须在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)