• rest-framework之分页器


    1、添加测试数据

    views.py

    from django.shortcuts import render
    from app01 import models
    from rest_framework.views import  APIView
    from rest_framework.response import  Response
    from rest_framework.versioning import URLPathVersioning
    
    
    class PublishView(APIView):
        versioning_class = URLPathVersioning
    
        def get(self, request, *args, **kwargs):
            # 批量添加
            ll = []
            for i in range(100):
                ll.append(models.Publish(name='%s出版社'%i, city='%s城市'%i))
            models.Publish.objects.bulk_create(ll)  # 批量插入,提高性能
            return Response()


    urls.py

    urlpatterns = [
        url(r'^admin/', admin.site.urls),
        url(r'^(?P<version>[v1|v2]+)/publish/', views.PublishView.as_view()),
    ]


    浏览器访问,添加数据http://127.0.0.1:8000/v1/publish/


    2、普通分页

    views.py

    from django.shortcuts import render
    from app01 import models
    from app01 import serializer
    from rest_framework.views import  APIView
    from rest_framework.response import  Response
    from rest_framework.versioning import URLPathVersioning
    
    # 导入模块
    from rest_framework.pagination import PageNumberPagination, LimitOffsetPagination, CursorPagination
    
    
    class PublishView(APIView):
        versioning_class = URLPathVersioning
    
        def get(self, request, *args, **kwargs):
            # 第一种,普通分页
            # 查询出所有数据
            ret = models.Publish.objects.all()
    
            # 实例化产生一个普通分页对象
            page = PageNumberPagination()
    
            # 每页显示3条
            page.page_size=3
    
            # 指定查询哪一页的key值;如 ?page=3-->?xxx=3
            page.page_query_param = 'xxx'
    
            # 前端控制每页显示多少条的查询key值比如size-9,表示一页显示9条
            page.page_size_query_param='size'
    
            # 控制每页最大显示多少,size如果传100,最多也是显示10
            page.max_page_size = 10
    
            ret_page = page.paginate_queryset(ret, request, self)
            # 序列化
            pub_ser = serializer.PublishSerializers(ret_page, many=True)
            # 还要去setting.py中配置每页显示多少条
    
            return Response(pub_ser.data)


    settings.py

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


    urls.py

    url(r'^(?P<version>[v1|v2]+)/publish/', views.PublishView.as_view()),


    serializer.py

    from rest_framework.serializers import ModelSerializer
    from app01 import models
    
    class PublishSerializers(ModelSerializer):
        class Meta:
            model = models.Publish
            fields = "__all__"


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

    views.py

    from django.shortcuts import render
    from app01 import models
    from app01 import serializer
    from rest_framework.views import  APIView
    from rest_framework.response import  Response
    from rest_framework.versioning import URLPathVersioning
    
    from rest_framework.pagination import PageNumberPagination, LimitOffsetPagination, CursorPagination
    
    
    class PublishView(APIView):
        versioning_class = URLPathVersioning
    
        def get(self, request, *args, **kwargs):
            # 第一种,普通分页
            # 查询出所有数据
            ret = models.Publish.objects.all()
    
            # 实例化产生一个偏移分页对象
            page = LimitOffsetPagination()
    
            # 从标杆位置往后取几个,默认取3,也可以指定
            page.default_limit = 3
    
            # limit表示的是在offset位置处,往后取的数目
            # http://127.0.0.1:8000/v1/publish/?offset=6&limit=4
            page.limit_query_param = 'limit'
    
            # offset就是标杆值,表示偏移到哪个位置,如果offset=6表示当前在第6条位置上,再往后取
            page.offset_query_param='offset'
    
            # limit就算写100,最大也只能往后取10条
            page.max_limit=10
    
            ret_page = page.paginate_queryset(ret, request, self)
            # 序列化
            pub_ser = serializer.PublishSerializers(ret_page, many=True)
            # 还要去setting.py中配置每页显示多少条  # return Response(pub_ser.data)

            # 调用这个方法返回的数据中会有总条数,上一页地址,下一页地
      return page.get_paginated_response(pub_ser.data)

    其他配置不变;

    image


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

    views.py

    from django.shortcuts import render
    from app01 import models
    from app01 import serializer
    from rest_framework.views import  APIView
    from rest_framework.response import  Response
    from rest_framework.versioning import URLPathVersioning
    
    from rest_framework.pagination import PageNumberPagination, LimitOffsetPagination, CursorPagination
    
    
    class PublishView(APIView):
    
        versioning_class = URLPathVersioning
    
        def get(self, request, *args, **kwargs):
            # 第一种,普通分页
            # 查询出所有数据
            ret = models.Publish.objects.all()
    
            # 实例化产生一个加密分页对象
            page = CursorPagination()
    
            # 每页显示的大小
            page.page_size = 3
    
            # 查询的key值; ?cursor=3
            page.cursor_query_param = 'cursor'
    
            # 按什么排序
            page.ordering = 'id'
    
            ret_page = page.paginate_queryset(ret, request, self)
            # 序列化
            pub_ser = serializer.PublishSerializers(ret_page, many=True)
            # 还要去setting.py中配置每页显示多少条
    
            # return Response(pub_ser.data)
            return page.get_paginated_response(pub_ser.data)


    image

  • 相关阅读:
    UVa 1643 Angle and Squares
    UVa 1210 (高效算法设计) Sum of Consecutive Prime Numbers
    UVa 1213 (01背包变形) Sum of Different Primes
    UVa 1644 (筛素数 + 二分) Prime Gap
    UVa 10048 (Floyd变形) Audiophobia
    UVa 247 (传递闭包) Calling Circles
    UVa 808 (建坐标系、找规律) Bee Breeding
    UVa 1151 (枚举 + MST) Buy or Build
    UVa 1395 (最小生成树) Slim Span
    UVa 11040 (水题) Add bricks in the wall
  • 原文地址:https://www.cnblogs.com/weiyiming007/p/12524424.html
Copyright © 2020-2023  润新知