Django rest-framework框架-组件之分页

分页:
  a. 分页,看第n页, 每页显示n条数据

from rest_framework import serializers
from api import models
from rest_framework.pagination import PageNumberPagination
class PagerSerializer(serializers.ModelSerializer):
      class Meta:
            model = models.Role
            fields = "__all__"
#第一版
#url http://www.t.com/api/v1/page/?page=2 显示第2页
class PagerView(APIView):
      def get(self, request, *args, **kwargs):
      	  #获取所有数据
          roles = models.Role.objects.all()
          #获取分页对象
          pg = PageNumberPagination()
          #在数据库中获取分页数据
          pager_roles = pg.paginate_queryset(queryset=roles, request=request,views=self)
          #对分页数据进行序列化
          ser = PagerSerializer(instance=pager_roles,many=True)
          return response(ser.data) 

#全局配置 分页参数 settings.py
REST_FRAMEWORK = {
	"PAGE_SIZE": 2,  #表示没页显示两个对象
}

第二版: 自定义分页
from rest_framework.pagination import PageNumberPagination
#自定义类  继承PageNumberPagination
class MyPagerNumberPagination(PageNumberPagination):
	  page_size = 2  #每页显示几个对象

	  #关键字 size  http://www.t.com/api/v1/page/?page=2&size=5
	  #可以定制一页显示多少个 
	  page_size_query_param = 'size'
	  #每页最大显示多少个  比如最大显示5个对象
	  max_page_size = 5
	  #关键字 page  http://www.t.com/api/v1/page/?page=2
	  page_query_param = 'page'


class PagerView(APIView):
      def get(self, request, *args, **kwargs):
      	  #获取所有数据
          roles = models.Role.objects.all()
          #获取分页对象
          pg = MyPagerNumberPagination()
          #在数据库中获取分页数据
          pager_roles = pg.paginate_queryset(queryset=roles, request=request,views=self)
          #对分页数据进行序列化
          ser = PagerSerializer(instance=pager_roles,many=True)
          #返回一个response对象 里面带上一页下一页的url
          return pg.get_paginated_response(ser.data)


b. 分页,在n个位置,向后查看n条数据

from rest_framework.pagination import LimitOffsetPagination
class MyLimitOffsetPagination(LimitOffsetPagination):
	  default_limit = 2  #每页显示几个对象
	  #关键字 size  http://www.t.com/api/v1/page/?offset=4&limit=5 从第4个开始向后取5条
	  #关键字 limit  从第几个开始向后取几条
	  limit_query_param = 'limit'
	  #关键字 offset  从第几个开始
	  offset_query_param = 'offset'
	  #最多向后显示限制5
	  max_limit = 5


class PagerView(APIView):
      def get(self, request, *args, **kwargs):
      	  #获取所有数据
          roles = models.Role.objects.all()
          #获取分页对象
          pg = MyLimitOffsetPagination()
          #在数据库中获取分页数据
          pager_roles = pg.paginate_queryset(queryset=roles, request=request,views=self)
          #对分页数据进行序列化
          ser = PagerSerializer(instance=pager_roles,many=True)
          #返回一个response对象 里面带上一页下一页的url
          return pg.get_paginated_response(ser.data)






c. 加密分页,上一页和下一页
from rest_framework.pagination import CursorPagination
class MyCursorPagination(CursorPagination):
	  page_size = 2  #每页显示几个对象
	  #关键字 size  http://www.t.com/api/v1/page/?cursor=3IUSE&¥@*#GEE
	  #关键字 cursor  
	  cursor_query_param = 'cursor'
	  #排序规则 使用id来排序 -号是倒序
	  ordering = '-id'
	  #最多向后显示限制5
	  cursor_size_query_param = None
	  max_page_size =None

class PagerView(APIView):
      def get(self, request, *args, **kwargs):
      	  #获取所有数据
          roles = models.Role.objects.all()
          #获取分页对象
          #加密http://www.t.com/api/v1/page/?cursor=3IUSE&¥@*#GEEW 页码加了密的
          pg = MyCursorPagination(order='id')
          #在数据库中获取分页数据
          pager_roles = pg.paginate_queryset(queryset=roles, request=request,views=self)
          #对分页数据进行序列化
          ser = PagerSerializer(instance=pager_roles,many=True)
          #返回一个response对象 里面带上一页下一页的url
          return pg.get_paginated_response(ser.data)

  

原文地址:https://www.cnblogs.com/kuku0223/p/11351840.html