排序和查询过滤器
过滤器的入口在GenericAPIView类中: filter_backends = api_settings.DEFAULT_FILTER_BACKENDS
def filter_queryset(self, queryset):
for backend in list(self.filter_backends):
queryset = backend().filter_queryset(self.request, queryset, self)
return queryset
一、序和查询过滤器使用
#drf.settings.py过滤器配置,可以全局配置和局部配置
# 1.Filtering过滤器的字段
'SEARCH_PARAM': 'search', # 查询过滤器
'ORDERING_PARAM': 'ordering', # 排序过滤器
from rest_framework.filters import OrderingFilter
# 过滤的类配置 eg filter_backends = [OrderingFilter]
'DEFAULT_PAGINATION_CLASS': None,
'DEFAULT_FILTER_BACKENDS': [], # 配置过滤器的种类
二、排序过滤器的使用
# 过滤器.导入排序过滤器的类
from rest_framework.filters import OrderingFilter
class FreeCourseListAPIView(ListAPIView):
queryset = models.Course.objects.filter(is_delete=False, is_show=True).order_by('orders').all()
serializer_class = serializers.FreeCourseModelSerializer
# 配置过滤器的类
filter_backends = [OrderingFilter]
# 参与排序的字段:url: ?ordering=-price,id
ordering_fields = ['price', 'id', 'students']
总结:
- 要导入要排序过滤器的字段
- 配置过滤器的类
- 配置参数过滤器的字段
- 排序url:http://127.0.0.1:8000/course/free?ordering=-price,-id,price为主排序字段,id为辅助排序字段,?ordering="排序的字段"
三、搜索过滤器的使用
# 导入搜索过滤器
from rest_framework.filters import SearchFilter
class FreeCourseListAPIView(ListAPIView):
queryset = models.Course.objects.filter(is_delete=False, is_show=True).order_by('orders').all()
serializer_class = serializers.FreeCourseModelSerializer
# 配置过滤器类
filter_backends = [SearchFilter]
# 参与搜索的字段: url: ?search=python (name字段中带python就ok)
# 参与搜索的字段支持反向查询
search_fields = ['name', 'brief','teacher__name'] # getattr(view, 'search_fields', None):
总结:
-
要导入搜索过滤器
-
配置搜索过滤器的类
-
配置要搜索过滤器的字段(序列化中的字段)
-
参与搜索的字段支持反向查询,
'teacher__name'
-
在前端页面关键词搜索是通过/search?wd=python或者/search?word=python,然后通过·this.(route.query.wd || this.)route.query.word;获取搜索的关系词进行筛选,
-
注意:params传参和query传参有什么区别:
(1)、用法上的
刚query要用path来引入会将数据拼接在url中,params要用name来引入,不会将数据拼接在请求url中,接收参数都是类似的,分别是this.(route.query.name和this.)route.params.name。
三、自定义过滤器
# 1.自定义过滤器
# 导入过滤器
from rest_framework.filters import BaseFilterBackend
# 继承过滤器
class LimitFilter(BaseFilterBackend):
# 重写方法
def filter_queryset(self, request, queryset, view):
limit = request.query_params.get("limit")
try:
return queryset[:int(limit)]
except:
return queryset
# 2使用过滤器
class FreeCourseListAPIView(ListAPIView):
queryset = models.Course.objects.filter(is_delete=False, is_show=True).order_by('orders').all()
serializer_class = serializers.FreeCourseModelSerializer
# 自定义过滤器
filter_backends = [LimitFilter]
总结:
- 继承BaseFilterBackend,重写filter_queryset,配置filter_backends = [LimitFilter] 使用url:http://127.0.0.1:8000/course/free?limit=2,获取两条数据