zoukankan      html  css  js  c++  java
  • 群查接口数据的分页、搜索、排序、分类、区间

    分页组件

    自定义分页类完成配置:pagination.py

    from rest_framework import pagination
    
    # 基础分页
    class PageNumberPagination(pagination.PageNumberPagination):
        # 默认一页显示的条数
        page_size = 2
        # 查询页面的关键字
        page_query_param = 'page'
        # 用户自定义一页显示条数的关键字
        page_size_query_param = 'page_size'
        # 用户最大可自定义一页显示的条数
        max_page_size = 3
    
    
    class LimitOffsetPagination(pagination.LimitOffsetPagination):
        # 默认一页显示的条数
        default_limit = 3  # default_limit = api_settings.PAGE_SIZE
        # 用户自定义一页显示的条数
        limit_query_param = 'limit'
        # 用户自定义偏移的条数
        offset_query_param = 'offset'
        # 用户最大可自定义一页显示的条数
        max_limit = 3
    
    

    群查接口的视图类:views.py

    from rest_framework import pagination 
    from . import paginations
    class FreeCourseListViewSet(mixins.ListModelMixin,GenericViewSet):
        queryset = models.Course.objects.filter(is_delete=False,is_show=True).all()
        serializer_class = serializer.CourseModelSerializer
        
        # 配置某一个分页类即可
        
        # 走系统分页类
        # pagination_class = pagination.PageNumberPagination
        # pagination_class = pagination.PageNumberPagination.page_size=2
        
        # 走自定义分页类
        pagination_class = paginations.PageNumberPagination  # 数字分页
        # pagination_class = paginations.LimitOffsetPagination  # 偏移分页
        
    # 注:接口分页前后,response的格式不一样
        # 分页前:数据时response.data
        # 分页后:数据时response.results.data
        '''
    GenericViewSet(viewset.py)继承了GenericAPIView(generic.py),
    GenericAPIView中有get_paginated_response方法,该方法内部有调用
    了分页器类(我们自定义的分页器类没实现这个方法,显然在继承的父类内部)内部的get_paginated_response方法,重新把序列化的结果(data)用有序字典做了组装:
            def get_paginated_response(self, data):
                return Response(OrderedDict([
                    ('count', self.count),
                    ('next', self.get_next_link()),
                    ('previous', self.get_previous_link()),
                    ('results', data)
                ]))
        '''
    

    过滤组件

    搜索

    群查接口的视图类:views.py

    from rest_framework.filters import SearchFilter
    class FreeCourseListViewSet(mixins.ListModelMixin,GenericViewSet):
        queryset = models.Course.objects.filter(is_delete=False,is_show=True).all()
        serializer_class = serializer.CourseModelSerializer
        
        # 过滤类:有filter_queryset(self,request,queryset,view)方法,返回值是queryset
        # 配置搜索组件
        filter_backends = [SearchFilter]  
        # 配置参与搜索字段
        search_fields = ['name', 'level']
        
        # 规则:
        # 参与全文搜索的字段为name,level,(两个字段必须是数据库表字段,不能走自定义的字段,比如level_name,
        # 接口:?search=搜索关键字,会全文匹配name和brief两个字段    
    

    排序

    群查接口的视图类:views.py

    from rest_framework.filters import OrderingFilter
    class FreeCourseListViewSet(mixins.ListModelMixin,GenericViewSet):
        queryset = models.Course.objects.filter(is_delete=False,is_show=True).all()
        serializer_class = serializer.CourseModelSerializer
        
        # 配置排序组件
        filter_backends = [OrderingFilter]  
        # 配置参与排序字段
        ordering_fields = ['price', 'id','students']
        
    '''规则:
    OrderingFilter组件:
          参与排序字段为price、id和students(三个字段必须都是数据库表字段)
          接口:
              ?ordering=price 按价格升序
              ?ordering=-price 按价格降序
              ?ordering=id 按主键升序
              ?ordering=-price,id 按价格降序,价格相同时按主键升序
    '''
    

    自定义

    自定义过滤类:filters.py

    # 自定义过滤器,自定义普通类,实现filter_queryset可以接受request,queryset,view返回过滤处理后的queryset即可
    class Myfilter:
        def filter_queryset(self,request,queryset,view):
            # 过滤条件是死的,?count=数字,也可以写高级一点,从view中去反射配置信息,或者将配置信息放在settings中
            count = request.query_params.get('count',None)
            if not count:
                return queryset  # 没过滤
            try:
                count = int(count)
                return queryset[:count]  # 过滤
            except:
                return queryset  # 没过滤
    
    

    群查接口的视图类views.py

    from .filters import Myfilter
    class FreeCourseListViewSet(mixins.ListModelMixin,GenericViewSet):
        queryset = models.Course.objects.filter(is_delete=False,is_show=True).all()
        serializer_class = serializer.CourseModelSerializer
        filter_backends = [Myfilter]
    

    分类与区间

    安装django-filter插件

    >: pip install django-filter  # 我在安装这个插件的时候更新了django的版本到3.0.7,导致项目运行报错,ImportError: cannot import name 'six' from 'django.utils',之后将django版本改到原来的版本就解决了。
    

    自定义过滤规则类:filters.py

    from django_filters.filterset import FilterSet
    from django_filters import filters
    from . import models
    
    class CourseFilterSet(FilterSet):
        # 实现区间:field_name关联model表属性,lookup_expr设置过滤规则
        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
            # min_price 和max_price 自定义规则字段可以不在fields中配置
            fields = ['course_category']
    

    群查接口的视图类views.py

    from django_filters.rest_framework import DjangoFilterBackend
    from .filters import CourseFilterSet
    class FreeCourseListViewSet(mixins.ListModelMixin,GenericViewSet):
        queryset = models.Course.objects.filter(is_delete=False,is_show=True).all()
        serializer_class = serializer.CourseModelSerializer
        
        # 配置过滤组件
        filter_backends = [DjangoFilterBackend]
        # 配置过滤规则的类
        filter_class = CourseFilterSet
        #规则:
        # ?course_category=1 课程分组1所有的课程
        # ?min_price=10 课程价格大于10的所有的课程
        # ?min_price=10&max_price 课程价格大于等于10小于等于100的所有的课程
    
  • 相关阅读:
    怎么在myeclipse中怎么集成Tomcat。
    JSP .基础概念
    继承
    封装
    什么是面向对象
    数据排序
    开发的套路
    Javabean规范
    转发和重定向
    md5加密
  • 原文地址:https://www.cnblogs.com/zhangchaocoming/p/13082357.html
Copyright © 2011-2022 走看看