首页 > 技术文章 > drf分页器

robert-zhou 2019-04-03 21:42 原文

drf分页器

1.第一种分页:
    类似于django中的分页
2.第二种分页:
    偏移分页
3.第三种分页:
    加密分页(查询速度快)
    无法跳跃

基本参数

from rest_framework.pagination import PageNumberPagination,LimitOffsetPagination,CursorPagination

page_size #每页显示的数量

page_query_param = 'page'  #/?page=2 查询的key

#指定当前页显示多少条
page_size_query_param#/?page=2&size=5 取第2页,显示5条

#当前页显示最多条数
max_page_size

第一种分页

from rest_framework.pagination import PageNumberPagination,LimitOffsetPagination,CursorPagination

#实例化产生一个分页对象
page = PageNumberPagination()

#第一个参数:要分页的数据,第二个参数,request,第三个参数,当前视图对象
page_list = page.paginate_queryset(book_list,request,self)#self为视图

#再序列化的时候,用分页之后的数据
ser = Myserializer(instance=page_list,many=True)
paginate_queryset

第二种分页,偏移分页

#默认每页显示多少
default_limit = 2

#标杆 /?offset=2&limit=3 以2位基础,显示3条 

offset_query_param='offset'

limit_query_param = 'limit'

#每页显示的最大条数
max_limit = 5

from rest_framework.pagination import LimitOffsetPagination

#实例化产生一个分页对象
page = LimitOffsetPagination()

#第一个参数:要分页的数据,第二个参数,request,第三个参数,当前视图对象
page_list = page.paginate_queryset(book_list,request,self)#self为视图

#再序列化的时候,用分页之后的数据
ser = Myserializer(instance=page_list,many=True)
paginate_queryset

第三种分页(加密分页)

#按nid排序
page.ordering = 'nid'
#查询的key值
cursor_query_param = 'cursor'
#每页显示多少条
page_size = 2

使用

1.生成对象(可以修改对象的属性)
2.ret = 对象.paginate_queryset()
3.丢到序列化类中,完成序列化

修改默认参数的两种方法

1.自定义分页类,继承PageNumberPagination
2.产生page = PageNumberPagination()对象后
page.page_size=5
page.page_query_param = 'size'

练习

from rest_framework.pagination import PageNumberPagination,LimitOffsetPagination,CursorPagination
from rest_framework.views import APIView
from django.http import JsonResponse
class Infos(APIView):
    def get(self,request,*args,**kwargs):
        res_page = int(request.query_params.get('page',0))
        conn = get_redis_connection()
        obj_li = []
        for key,value in conn.hscan_iter('dic1',count=1000):
             k =key.decode('utf-8')
             v = value.decode('utf-8')
             obj_li.append({k:v})
        page = PageNumberPagination()
        page.page_size = 120
        max_page =int(len(obj_li)/page.page_size)
        if res_page > max_page:
            return HttpResponse('超过最大页数')
        page_list = page.paginate_queryset(obj_li,request,self)
        return JsonResponse(page_list,safe=False)

推荐阅读