zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    mybatis xml中是sql语句报错: Error creating document instance. Cause: org.xml.sax.SAXParseException: The
    先排序,后取前xx条数据
    SQL判断字段是否为空,为NULL,且连续两个字段降序排列(oracle)
    double数据保留两位
    ajax在echart代码中的正确使用
    List集合去重排序
    如何把项目中的lib下的jar包,本机上的jar包导入项目中引用
    MongoVue如何执行JS文件
    三维叠加标签代码
    beatfullsoup
  • 原文地址:https://www.cnblogs.com/weiyiming007/p/12524424.html
Copyright © 2011-2022 走看看