如何在模型上使用 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',
)
}
我有一个模型可以说 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',
)
}