Fork me on GitHub

Django:RestFramework之-------分页

9.分页操作

  • 分页,看第n页,每页显示n条数据
  • 分页,在n个位置,向后查看n条数据.
  • 加密分页,上一页和下一页
1.基于PageNumberPagination分页

1.路由:

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

2.视图函数

from rest_framework.pagination import PageNumberPagination
from rest_framework.response import Response
#分页需要导入类
class SplitpageView(APIView):
    def get(self,request,*args,**kwargs):
        #获取所有数据
        roles = models.Role.objects.all()
        #创建分页对象
        pg = PageNumberPagination()
        #在数据库中获取分页的数据
        pager_roles = pg.paginate_queryset(queryset=roles,request=request,view=self)
        print(pager_roles)
        #对数据进行序列化
        ser = PagerSerialiser(instance=pager_roles,many=True)
        return Response(ser.data)
#settings.py配置
REST_FRAMEWORK = {
     "PAGE_SIZE":2,
}
  • 返回效果:

  • 自定义分页:
class MyPageNumberPagination(PageNumberPagination):
    #一页显示数量
    page_size = 2
    #设置
    page_size_query_param = "size"
    #每页最大数量
    max_page_size = 5
    #url页数变量设置:
    page_query_param = "page"

class SplitpageView(APIView):
    def get(self,request,*args,**kwargs):
        #获取所有数据
        roles = models.Role.objects.all()
        #创建分页对象
        pg = PageNumberPagination()
        #在数据库中获取分页的数据
        pager_roles = pg.paginate_queryset(queryset=roles,request=request,view=self)
        print(pager_roles)
        #对数据进行序列化
        ser = PagerSerialiser(instance=pager_roles,many=True)

        return Response(ser.data)

  • 显示效果:

  • 显示上一页与下一页,url

    #上面函数基础上:
    res = pg.get_paginated_response(ser.data)
    return ret
    

2.基于LimitOffsetPagination实现分页
class MyPageNumberPagination2(LimitOffsetPagination):
    default_limit = 2
    limit_query_param = "limit"
    offset_query_param = "offset"
    max_limit = 5

class SplitpageView(APIView):
    def get(self,request,*args,**kwargs):
        #获取所有数据
        roles = models.Role.objects.all()
        #创建分页对象
        pg = MyPageNumberPagination2()
        #在数据库中获取分页的数据
        pager_roles = pg.paginate_queryset(queryset=roles,request=request,view=self)
        print(pager_roles)
        #对数据进行序列化
        ser = PagerSerialiser(instance=pager_roles,many=True)
        return Response(ser.data)

  • 显示结果

3.基于CursorPagination 分页(加密)
from rest_framework.pagination import CursorPagination
class MyPageNumberPagination3(CursorPagination):
    #
    cursor_query_param = "cursor"
    page_size = 2
    ordering = 'id'
    page_size_query_param = None
    max_page_size = None


class SplitpageView(APIView):
    def get(self,request,*args,**kwargs):
        #获取所有数据
        roles = models.Role.objects.all()
        #创建分页对象
        pg = MyPageNumberPagination3()
        #在数据库中获取分页的数据
        pager_roles = pg.paginate_queryset(queryset=roles,request=request,view=self)
        print(pager_roles)
        #对数据进行序列化
        ser = PagerSerialiser(instance=pager_roles,many=True)
        return pg.get_paginated_response(ser.data)

4.总结:
#如果数据量大,如何做分页.
	数据库性能相关? 
posted @ 2019-11-13 17:28  是阿凯啊  阅读(139)  评论(0编辑  收藏  举报