zoukankan      html  css  js  c++  java
  • 排序和查询过滤器

    排序和查询过滤器

    过滤器的入口在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,获取两条数据
  • 相关阅读:
    pmtk3
    SIFT算法研究
    Kd-Tree算法原理和开源实现代码
    统计学习精要
    svm
    UIUC同学Jia-Bin Huang收集的计算机视觉代码合集
    图像识别领域的一些code
    传输媒体、表示媒体、感觉媒体、表现媒体的区别
    海明码奇偶校验
    ip和子网掩码的判断
  • 原文地址:https://www.cnblogs.com/randysun/p/12293085.html
Copyright © 2011-2022 走看看