• 分页,过滤,搜索,排序


    分页组件

    基础分页(常用)

    方法一:
    直接使用 drf 分页类,在视图中完成分页类的必要配置
    
    from rest_framework.pagination import PageNumberPagination, LimitOffsetPagination, CursorPagination
    class CourseViewSet(GenericViewSet, ListModelMixin):
        queryset = models.Course.objects.filter(is_delete=False,
                                                is_show=True).all()
        serializer_class = serializers.CourseSerializer
    
        pagination_class = PageNumberPagination
        PageNumberPagination.page_size = 1
    

    自定义分页

    方法二:
    自定义分页类继承 drf 分页类,在自定义分页类中完成配置,视图类中使用自定义分页类
    1  重写分页类,自定义同名类继承 drf 的分页类
    2  完成必要的配置
    3  将重写的分页类配置给群查需求的视图类
    

    pagination.py

    from rest_framework.pagination import PageNumberPagination as DrfPageNumberPagination
    
    class PageNumberPagination(DrfPageNumberPagination):
        # 默认一页显示的条数
        page_size = 2
        # url 中携带页码的 key
        page_query_param = 'page'
        # url 中用户携带自定义一页条数的 key
        page_size_query_param = 'page_size'
        # 用户最大可自定义一页的条数
        max_page_size = 2
    

    views.py

    # 导入自己的类
    from . import pagination
    from rest_framework.pagination import PageNumberPagination, LimitOffsetPagination, CursorPagination
    class CourseViewSet(GenericViewSet, ListModelMixin):
        queryset = models.Course.objects.filter(is_delete=False,
                                                is_show=True).all()
        serializer_class = serializers.CourseSerializer
    
        # 一行
        pagination_class = pagination.PageNumberPagination
    

    偏移分页

    pagination.py

    from rest_framework.pagination import LimitOffsetPagination as DrfLimitOffsetPagination
    class LimitOffsetPagination(DrfLimitOffsetPagination):
        # 默认一页显示的条数
        default_limit = 1
        # url 中用户携带自定义一页条数的 key
        limit_query_param = 'limit'
        # url 中用户携带自定义偏移条数的 key
        offset_query_param = 'offset'
        # 用户最大可自定义一页的条数
        max_limit = 3
    

    views.py

    	...
        # 偏移分页器,没有固定页码,自定义从偏移量开始网后续查询自定义条数
        # http://127.0.0.1:8000/course/free/?offset=1&limit=2
        pagination_class = pagination.LimitOffsetPagination
    
    

    游标分页(了解)

    pagination.py

    # 游标分页器
    from rest_framework.pagination import CursorPagination as DrfCursorPagination
    class CursorPagination(DrfCursorPagination):
        # 默认一页显示的条数
        page_size = 2
        # url中携带页码的key(编码后的结果)
        cursor_query_param = 'cursor'
        # url中用户携带自定义一页条数的key
        page_size_query_param = 'page_size'
        # 用户最大可自定义一页的条数
        max_page_size = 3
        # 游标分页器的特殊点:
        # 1)如果视图类没有配 排序过滤组件filter_backends = [OrderingFilter],采用 ordering 设置的作为默认排序规则
        # 2)如果视图类配了 排序过滤组件filter_backends = [OrderingFilter],url请求必须带上ordering排序规则,因为默认排序规则失效
        # 注:因为游标分页是基于排序后结果上的分页
        ordering = '-price'
    


    过滤组件

    搜索组件

    """
    搜索组件
    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的所有结果
    """
    

    自定义过滤组件

    自定义过滤器

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

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

    3)将自定义过滤类配置给群查视图类的filter_backends

    fiters.py

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

    views.py

    from rest_framework.filters import SearchFilter, OrderingFilter
    from . import pagination
    from .filters import CountFilter
    from rest_framework.pagination import PageNumberPagination, LimitOffsetPagination, CursorPagination
    class CourseViewSet(GenericViewSet, ListModelMixin):
        queryset = models.Course.objects.filter(is_delete=False, is_show=True).all()                                        
        serializer_class = serializers.CourseSerializer
    
        filter_backends = [SearchFilter, OrderingFilter, CountFilter]
        # orderingFilter 排序 http://127.0.0.1:8000/course/free/?ordering=-price,id
        search_fields = ['name', 'id']
    

    # Django-filter 插件

    安装

    pip install django-filter
    

    models 有的字段用方式一,其他看情况

    分类过滤 方式一

    1)在视图文件views.py中导入django-filter的功能组件
    from django_filters.rest_framework import DjangoFilterBackend
    
    2)将搜索组件配置给群查接口视图类的filter_backends
    filter_backends = [DjangoFilterBackend]
    
    3)配置视图类关联的Model表可以分类的字段(通常是可以分组的字段)
    filter_fields = ['course_category']
    
    4)前台访问该群查接口,采用拼接参数方式用分类course_category字段将分类条件提供给后台
    http://127.0.0.1:8000/course/free/?course_category=1  # 拿课程分类1下的所有课程
    
    from django_filters.rest_framework import DjangoFilterBackend
    
    class CourseViewSet(GenericViewSet, ListModelMixin):
        queryset = models.Course.objects.filter(is_delete=False, is_show=True).all()
        serializer_class = serializers.CourseSerializer
    
        filter_backends = [DjangoFilterBackend]
    
        filter_fields = ['course_category']
    

    分类过滤 方式二

    1)自定义过滤类继承django-filter插件的FilterSet类,绑定Model表,并设置分类字段
    新建 filters.py 文件
    
    from django_filters.filterset import FilterSet
    from . import models
    class CourseFilterSet(FilterSet):
        class Meta:
            model = models.Course
            fields = ['course_category']
    
    2)在视图文件views.py中导入django-filter的功能组件及自定义的过滤类
    from django_filters.rest_framework import DjangoFilterBackend
    from .filters import CourseFilterSet
            
    3)将搜索组件配置给群查接口视图类的filter_backends
    filter_backends = [DjangoFilterBackend]
    
    4)配置视图类关联的自定义过滤类
    filter_class = CourseFilterSet
    
    5)前台访问该群查接口,采用拼接参数方式用分类course_category字段将分类条件提供给后台
    http://127.0.0.1:8000/course/free/?course_category=1  # 拿课程分类1下的所有课程
    

    区间过滤

    """
    1)自定义过滤类继承django-filter插件的FilterSet类,绑定Model表,并设置自定义区间规则字段
    from django_filters.filterset import FilterSet
    from . import models
    class CourseFilterSet(FilterSet):
        # 区间过滤:field_name关联的Model字段;lookup_expr设置规则;gt是大于,gte是大于等于;
        min_price = filters.NumberFilter(field_name='price', lookup_expr='gte')
        max_price = filters.NumberFilter(field_name='price', lookup_expr='lte')
        class Meta:
            model = models.Course
            fields = ['min_price', 'max_price']
    
    2)在视图文件views.py中导入django-filter的功能组件及自定义的过滤类
    from django_filters.rest_framework import DjangoFilterBackend
    from .filters import CourseFilterSet
            
    3)将搜索组件配置给群查接口视图类的filter_backends
    filter_backends = [DjangoFilterBackend]
    
    4)配置视图类关联的自定义过滤类
    filter_class = CourseFilterSet
    
    5)前台访问该群查接口,采用拼接参数方式用自定义区间规则字段将区间条件提供给后台
    http://127.0.0.1:8000/course/free/?min_price=30&max_price=60  # 拿课程价格在30~60的所有课程
    """
    
  • 相关阅读:
    DOM对象的一些常用方法
    body-parser的使用
    CSS中box-sizing: border-box
    ES6 数组方法 --- map() filter() find()的用法
    JavaScript --- 预编译
    Vue过滤器filter
    Lock wait timeout exceeded; try restarting transaction
    lead函数
    Mysql 数据词典
    OOD
  • 原文地址:https://www.cnblogs.com/kai-/p/12423372.html
Copyright © 2020-2023  润新知