zoukankan      html  css  js  c++  java
  • Django-rest-framework --- 分页,过滤,排序组件

    """
    celery框架:
    	定义:异步任务框架 -独立运行的服务器,由三部分组成
    
    """
    

    drf --- 分页,过滤,排序组件

    drf --- 分页组件

    1.系统

    1.定义一个类,继承ListModelMixin, GenericViewSet视图类

    2.定义queryset对象和serializer_class

    3.自定义分页类组件的参数,走自定义的分页组件

    view.py中

    from rest_framework import pagination   # 自带的分页组件
    class FreeCourseListViewSet(ListModelMixin, GenericViewSet):
        queryset = models.Course.objects.filter(is_delete=False, is_show=True).all()
        serializer_class = serializers.CourseModelSerializer
    	# 自定义分页类组件参数
        pagination_class = pagination.PageNumberPagination
    

    2.自定义

    1.新建一个文件夹,重新定义PageNumberPagination类,继承pagination.PageNumberPagination

    2.配置自定义的关键字参数

    3.在view.py的视图中调用该类,让该对象在进行分页的时候走自定义的分页类

    paginations.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 = 2
    
    

    view.py中

    # 走自定义分页类
    pagination_class = paginations.PageNumberPagination
    

    3.偏移分页(了解)

    没有固定的第一页是从第几条开始的,可以从中间的某一条开始往后显示

    偏移分页与自定义分页一致,不同点在于在自定义的paginations.py的文件中使用的类不一致

    class LimitOffsetPagination(pagination.LimitOffsetPagination):
        # 默认一页显示的条数
        default_limit = 2
        # 用户自定义一页显示的条数
        limit_query_param = 'limit'   # 在url中定义显示几条
        # 用户自定义偏移的条数
        offset_query_param = 'offset'    # 在url中表明偏移几条
        # 用户最大可自定义一页显示的条数
        max_limit = 2
    

    注意

    # 配置某一个分页类即可
    pagination_class = paginations.PageNumberPagination
    # 注:接口分页前后,response的格式不一样
    #       分页前:数据是response.data
    #       分页后:数据是response.data.results
    

    搜索过滤

    搜索过滤器

    对提供的信息进行全文搜索过滤

    view.py中

    from rest_framework.filters import SearchFilter,OrderingFilter   # 搜索组件
    class FreeCourseListViewSet(ListModelMixin, GenericViewSet):
        queryset = models.Course.objects.filter(is_delete=False, is_show=True).all()
        serializer_class = serializers.CourseModelSerializer
    
        # 配置搜索组件,调用[ ]中的类进行排序
        filter_backends = [SearchFilter]
        # 配置参与搜索字段,[ ]内是或的关系,参与全文搜索的字段必须都是数据库表字段
        search_fields = ['name']
        
    # 搜索的时候使用的路由:localhost/user/?search=linux  会直接搜索name=linux的信息
    

    排序过滤器

    from rest_framework.filters import OrderingFilter
    class FreeCourseListViewSet(ListModelMixin, GenericViewSet):
        queryset = models.Course.objects.filter(is_delete=False, is_show=True).all()
        serializer_class = serializers.CourseModelSerializer
        
        # 配置排序组件,调用[ ]中的类进行排序
        filter_backends = [OrderingFilter]
        # 配置参与排序字段
        ordering_fields = ['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(ListModelMixin, GenericViewSet):
        queryset = models.Course.objects.filter(is_delete=False, is_show=True).all()
        serializer_class = serializers.CourseModelSerializer
        
        # 配置排序组件
        filter_backends = [MyFilter]
        
    
    

    分类与区间

    django-filter

    前后端分离或者不分离都可以做,

    实现分类有两种方式,一种按照filters_field字段,一种写一个filters_class 类,推荐使用类的写法,类的写法可以定义区间,可以确定在某一区间中内的之

    安装django-filter插件
    >: pip install django-filter
    
    
    自定义过滤规则类: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')
        # 使用区间的时候url中查询的方式是:localhost/?自定义区间字段(min_price=10&max_price=100),意思是10到99之间的价格
        
        class Meta:
            model = models.Course
            # min_price 和 max_price 自定义规则字段可以不在fields中配置
            fields = ['course_category']
    
    

    view.py

    # 第一种配置,配置字段:
    # filter_fields = ['course_category']
    # 第二个配置,配置类
    filter_class = CourseFilterSet
    
    
    群查接口的视图类:views.py
    from django_filters.rest_framework import DjangoFilterBackend
    from .filters import CourseFilterSet
    class FreeCourseListViewSet(ListModelMixin, GenericViewSet):
        queryset = models.Course.objects.filter(is_delete=False, is_show=True).all()
        serializer_class = serializers.CourseModelSerializer
        
        # 配置过滤组件
        filter_backends = [DjangoFilterBackend]
        # 配置过滤规则的类
        filter_class = CourseFilterSet
        # 规则:
        #       ?course_category=1 课程分组1所有的课程
        #       ?min_price=10 课程价格大于等于10的所有课程
        #       ?min_price=10&max_price=100 课程价格大于等于10小于等于100的所有课程
    
    
  • 相关阅读:
    [转载] 常用CASE工具介绍
    GridView, DataGrid 中,DataFormatString语法汇总
    [轉]SQL Server中数据类型详解
    强烈推荐asp.net数据访问的官方指南系列 (Data Access Tutorials)
    实现iFrame自适应高度,原来很简单!
    [转]Web service到底是什么?在什么情况下,你应该使用web service
    贴一个查询SQL Server数据库中所有表及其描述(Description)的SQL语句
    C#中,String和string的区别
    ERWin 连接SQL Sever2005的问题
    [转载]ERwin相关概念入门
  • 原文地址:https://www.cnblogs.com/whkzm/p/12190207.html
Copyright © 2011-2022 走看看