排序和查询过滤器

排序和查询过滤器

过滤器的入口在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']

总结:

  1. 要导入要排序过滤器的字段
  2. 配置过滤器的类
  3. 配置参数过滤器的字段
  4. 排序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):

总结:

  1. 要导入搜索过滤器

  2. 配置搜索过滤器的类

  3. 配置要搜索过滤器的字段(序列化中的字段)

  4. 参与搜索的字段支持反向查询,'teacher__name'

  5. 搜索url:http://127.0.0.1:8000/course/free?search=python,python为要搜索的信息,信息为字段中对应的数据中包含的数据进行筛选,?search="要搜索的字符串(搜索的信息)"(配置字段全文搜索)

  6. 在前端页面关键词搜索是通过/search?wd=python或者/search?word=python,然后通过·this.\(route.query.wd || this.\)route.query.word;获取搜索的关系词进行筛选,

  7. 注意: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]    

总结:

  1. 继承BaseFilterBackend,重写filter_queryset,配置filter_backends = [LimitFilter] 使用url:http://127.0.0.1:8000/course/free?limit=2,获取两条数据

猜你喜欢

转载自www.cnblogs.com/randysun/p/12293085.html