DRF过滤器
https://www.django-rest-framework.org/api-guide/filtering
一般情况下,我们可以重写DRF视图类的get_queryset()
方法来实现查询结果集的过滤。
例如,根据request.user
来过滤结果集
from myapp.models import Purchase
from myapp.serializers import PurchaseSerializer
from rest_framework import generics
class PurchaseList(generics.ListAPIView):
serializer_class = PurchaseSerializer
def get_queryset(self):
user = self.request.user
return Purchase.objects.filter(purchaser=user)
# 或者根据URL路径参数过滤
# username = self.kwargs['username']
# return Purchase.objects.filter(purchaser__username=username)
# 再或者根据get请求查询字符串过滤
# username = self.request.query_params.get('username')
# return Purchase.objects.filter(purchaser__username=username)
除此之外,DRF还可提供了过滤后端类来实现过滤功能。
设置过滤后端
全局设置
REST_FRAMEWORK = {
'DEFAULT_FILTER_BACKENDS': ['django_filters.rest_framework.DjangoFilterBackend']
}
视图类中局部设置
import django_filters.rest_framework
from django.contrib.auth.models import User
from myapp.serializers import UserSerializer
from rest_framework import generics
class UserListView(generics.ListAPIView):
queryset = User.objects.all()
serializer_class = UserSerializer
filter_backends = [django_filters.rest_framework.DjangoFilterBackend]
常用过滤后端
django-filter第三方包
OrderingFilter 排序过滤器
OrderingFilter
类支持简单的查询参数控制的结果排序。
默认情况下,查询参数名为 'ordering'
,可以通过设置选项 ORDERING_PARAM
来覆盖。
REST_FRAMEWORK = {
'ORDERING_PARAM': 'order_by'
}
例如,要按用户名对用户进行排序:
http://example.com/api/users?ordering=username
还可以通过在字段名称前添加“-”来实现倒序排序,如下所示:
http://example.com/api/users?ordering=-username
也可以同时指定多个排序的字段
http://example.com/api/users?ordering=account,username
设置可排序字段
默认情况下认允许用户过滤 serializer_class
属性指定的序列化器上的任何可读字段(read_only
)。
但是建议自己设置可排序字段,这有助于防止意外的数据泄露。
设置方法:通过ordering_fields
属性设置
class UserListView(generics.ListAPIView):
queryset = User.objects.all()
serializer_class = UserSerializer
filter_backends = [filters.OrderingFilter]
ordering_fields = ['username', 'email']
如果您确信视图使用的查询集不包含任何敏感数据,您还可以使用特殊值 '__all__'
显式指定视图应允许对任何模型字段或查询集聚合进行排序
class UserListView(generics.ListAPIView):
queryset = User.objects.all()
serializer_class = UserSerializer
filter_backends = [filters.OrderingFilter]
ordering_fields = "__all__"
指定默认排序字段
可以通过ordering
属性设置默认排序字段
class UserListView(generics.ListAPIView):
queryset = User.objects.all()
serializer_class = UserSerializer
filter_backends = [filters.OrderingFilter]
ordering_fields = ['username', 'email']
ordering = ['username']
SearchFilter 搜索过滤器
很简单的,看官方
https://www.django-rest-framework.org/api-guide/filtering/#searchfilter
本文来自博客园,作者:蕝戀,转载请注明原文链接:https://www.cnblogs.com/juelian/p/17561852.html