zoukankan      html  css  js  c++  java
  • 分页器

    # 路由
    url(r'^page', views.Page.as_view()),
    
    
    # 视图
    from rest_framework import serializers
    from app01 import models
    
    class Bookser(serializers.ModelSerializer):
        class Meta:
            model=models.Book
            fields='__all__'
    
    
    from rest_framework.pagination import PageNumberPagination,LimitOffsetPagination,CursorPagination
    # 1 简单分页
    # class Page(APIView):
    #     def get(self,request,*args,**kwargs):
    #         ret=models.Book.objects.all()
    #         my_page=PageNumberPagination()
    #         my_page.page_size=2
    #         # my_page.page_query_param='aa'
    #         my_page.page_size_query_param='size'
    #         my_page.max_page_size=5
    #         page_list = my_page.paginate_queryset(ret,request,self)
    #         ser = Bookser(instance=page_list,many=True)
    #         '''
    #         每页显示多少条
    #         page_size = api_settings.PAGE_SIZE
    #         查询指定页码的参数
    #         page_query_param = 'page'
    #         指定每页显示条数
    #         page_size_query_param = None
    #         限制每页显示最大条数
    #         max_page_size = None
    #         '''
    #         return Response(ser.data)
    
    # 2 偏移分页
    # class Page(APIView):
    #     def get(self,request,*args,**kwargs):
    #         ret=models.Book.objects.all()
    #         my_page=LimitOffsetPagination()
    #         my_page.default_limit=3  #http://127.0.0.1:8000/page/?offset=1&limit=3
    #         my_page.max_limit=5 #http://127.0.0.1:8000/page/?offset=1&limit=3
    #
    #         '''
    #         默认显示多少条
    #         default_limit = api_settings.PAGE_SIZE
    #         最大显示多少条
    #         max_limit = None
    #         重新命名limit(limit=3:表明显示三条,受 max_limit的限制)
    #         limit_query_param = 'limit'
    #         指定查询的标杆名 (offset=1:表明从第二条开始,往后偏移)
    #         offset_query_param = 'offset'
    #         '''
    #         page_list = my_page.paginate_queryset(ret,request,self)
    #         ser = Bookser(instance=page_list,many=True)
    #
    #         # return Response(ser.data)
    #         # 对Response做了封装,返回内容里有:总条数,上一页,下一页的链接
    #         return my_page.get_paginated_response(ser.data)
    
    # 加密分页
    class Page(APIView):
        def get(self,request,*args,**kwargs):
            ret=models.Book.objects.all()
            my_page=CursorPagination()
            my_page.ordering='id'
            my_page.page_size=2
            '''
            http://127.0.0.1:8000/page/
            
            cursor_query_param = 'cursor' 查询的名字
            page_size = api_settings.PAGE_SIZE 每页显示的条数
            ordering = '-created' 按谁排序
            '''
            page_list = my_page.paginate_queryset(ret,request,self)
            ser = Bookser(instance=page_list,many=True)
    
            # return Response(ser.data)
            # 对Response做了封装,返回内容里有:总条数,上一页,下一页的链接
            return my_page.get_paginated_response(ser.data)
    实例

    一 简单分页(查看第n页,每页显示n条)

    二 偏移分页(在第n个位置,向后查看n条数据)

    三 CursorPagination(加密分页,只能看上一页和下一页,速度快)

    一 简单分页(查看第n页,每页显示n条)

    复制代码
    from rest_framework.pagination import PageNumberPagination
    # 一 基本使用:url=url=http://127.0.0.1:8000/pager/?page=2&size=3,size无效
    class  Pager(APIView):
        def get(self,request,*args,**kwargs):
            # 获取所有数据
            ret=models.Book.objects.all()
            # 创建分页对象
            page=PageNumberPagination()
            # 在数据库中获取分页的数据
            page_list=page.paginate_queryset(ret,request,view=self)
            # 对分页进行序列化
            ser=BookSerializer1(instance=page_list,many=True)
            return Response(ser.data)
    # 二 自定制 url=http://127.0.0.1:8000/pager/?page=2&size=3
    # size=30,无效,最多5条
    class Mypage(PageNumberPagination):
        page_size = 2
        page_query_param = 'page'
        # 定制传参
        page_size_query_param = 'size'
        # 最大一页的数据
        max_page_size = 5
    class  Pager(APIView):
        def get(self,request,*args,**kwargs):
            # 获取所有数据
            ret=models.Book.objects.all()
            # 创建分页对象
            page=Mypage()
            # 在数据库中获取分页的数据
            page_list=page.paginate_queryset(ret,request,view=self)
            # 对分页进行序列化
            ser=BookSerializer1(instance=page_list,many=True)
            # return Response(ser.data)
            # 这个也是返回Response对象,但是比基本的多了上一页,下一页,和总数据条数(了解即可)
            return page.get_paginated_response(ser.data)

    复制代码

    setting里

    REST_FRAMEWORK = {
        # 每页显示两条
        'PAGE_SIZE':2
    }

     路由:

    url(r'^pager/$', views.Pager.as_view()),

     Serializers

    class BookSerializer1(serializers.ModelSerializer):
        class Meta:
            model=models.Book
            # fields="__all__"
            exclude=('authors',)

    二 偏移分页(在第n个位置,向后查看n条数据)

    复制代码
    # http://127.0.0.1:8000/pager/?offset=4&limit=3
    from rest_framework.pagination import LimitOffsetPagination
    # 也可以自定制,同简单分页
    class  Pager(APIView):
        def get(self,request,*args,**kwargs):
            # 获取所有数据
            ret=models.Book.objects.all()
            # 创建分页对象
            page=LimitOffsetPagination()
            # 在数据库中获取分页的数据
            page_list=page.paginate_queryset(ret,request,view=self)
            # 对分页进行序列化
            ser=BookSerializer1(instance=page_list,many=True)
            # return page.get_paginated_response(ser.data)
            return Response(ser.data)
    复制代码
     

    三 CursorPagination(加密分页,只能看上一页和下一页,速度快)

    思考:不重写类,修改类属性?

    复制代码
    from rest_framework.pagination import CursorPagination
    # 看源码,是通过sql查询,大于id和小于id
    class  Pager(APIView):
        def get(self,request,*args,**kwargs):
            # 获取所有数据
            ret=models.Book.objects.all()
            # 创建分页对象
            page=CursorPagination()
            page.ordering='nid'
            # 在数据库中获取分页的数据
            page_list=page.paginate_queryset(ret,request,view=self)
            # 对分页进行序列化
            ser=BookSerializer1(instance=page_list,many=True)
            # 可以避免页码被猜到
            return page.get_paginated_response(ser.data)
    复制代码
  • 相关阅读:
    算法训练 P1103
    算法训练 表达式计算
    算法训练 表达式计算
    基础练习 时间转换
    基础练习 字符串对比
    Codeforces 527D Clique Problem
    Codeforces 527C Glass Carving
    Codeforces 527B Error Correct System
    Codeforces 527A Glass Carving
    Topcoder SRM 655 DIV1 250 CountryGroupHard
  • 原文地址:https://www.cnblogs.com/xujinjin18/p/9839747.html
Copyright © 2011-2022 走看看