zoukankan      html  css  js  c++  java
  • drf框架中搜索、排序和自定义的过滤组件

    搜索组件

    使用步骤

    1、在视图文件views.py中导入drf的搜索组件

    from rest_framework.filters import SearchFilter

    2、将搜索组件配置给视图类的filter_backends

    filter_backends = [SearchFilter]

    3、配置视图类关联的Model表参与搜索的字段

    search_fields = ['name', 'id']

    4、前台访问该群查接口,采用拼接参数方式用search关键字将搜索目标提供给后台

    http://127.0.0.1:8000/course/free/?search=2 # id或name中包含2的所有结果

    详细使用

    自定义视图类中的相关设置参数

    from rest_framework.filters import SearchFilter
    class CourseViewSet(GenericViewSet, ListModelMixin):
        queryset = models.Course.objects.filter(is_delete=False, is_show=True).all()
        serializer_class = serializers.CourseSerializer
        # 过滤组件:实际开发,有多个过滤条件时,要把优先级高的放在前面
        filter_backends = [SearchFilter,]
        # 参与搜索的字段
        search_fields = ['name', 'id']

    其中search_fields前面添加各种字符来限制搜索行为

    • ^以指定内容开头
    • =完全匹配
    • @全文搜索(目前只支持django数据存放在mysql)
    • $正则匹配

    排序组件

    使用步骤

    1、在视图文件views.py中导入drf的搜索组件

    from rest_framework.filters import OrderingFilter

    2、将搜索组件配置给视图类的filter_backends

    filter_backends = [OrderingFilter]

    3、配置视图类关联的Model表允许排序的字段

    ordering_fields = ['id', 'price']

    4、前台访问该群查接口,采用拼接参数方式用search关键字将搜索目标提供给后台

    http://127.0.0.1:8000/course/free/?ordering=price,-id # 按price升序,如果price相同,再按id降序

    详细使用

    from rest_framework.filters import SearchFilter, OrderingFilter
    class CourseViewSet(GenericViewSet, ListModelMixin):
        queryset = models.Course.objects.filter(is_delete=False, is_show=True).all()
        serializer_class = serializers.CourseSerializer
        # 过滤组件:实际开发,有多个过滤条件时,要把优先级高的放在前面
        filter_backends = [OrderingFilter, ]# 允许排序的字段
        ordering_fields = ['id', 'price']

    自定义过滤组件

    使用步骤

    1、自定义类实现filter_queryset方法即可,接收request, queryset, view参数

    2、制定过滤条件,将过滤成功后的queryset返回即可,如果过滤失败,返回原样的queryset

    3、将自定义过滤类配置给视图类的filter_backends

    详细使用

    filters.py

    # 前台接口:/course/free/?count=2 ,代表只对前台返回2条数据
    class CountFilter:
        def filter_queryset(self, request, queryset, view):
            count = request.query_params.get('count', None)
            try:
                # TODO: 切片后的queryset不能再做ORM Q查询,如何实现queryset切片,现在再过滤时后配置
                # 结论:drf的搜索组件和排序组件都是建立在表的所有数据基础上的过滤规则,所以该自定义过滤类在视图类配置中
                # filter_backends = [SearchFilter, OrderingFilter, CountFilter] 必须在前两者之后
                return queryset[:int(count)]
            except:
                return queryset

    views.py

    from .filters import CountFilter
    class CourseViewSet(GenericViewSet, ListModelMixin):
        queryset = models.Course.objects.filter(is_delete=False, is_show=True).all()
        serializer_class = serializers.CourseSerializer
    filter_backends = [CountFilter,]

     

  • 相关阅读:
    orm 锁 和 事务
    多表查询
    django 单表查询
    djgango装饰器
    几个SQL命令的使用
    怎么成为优秀的软件模型设计者?
    jbpm 工作流(二)
    Jbpm工作流(一)
    EJB 介绍
    JNDI 使用
  • 原文地址:https://www.cnblogs.com/baohanblog/p/12425215.html
Copyright © 2011-2022 走看看