REST-Framework: 分页器
分页器的应用说明:
分页往往是在查询的结果是多条数据而我们又不需要一次性显示或者阅读的时候使用的,在Rest-Framework中也内置了分页器的组件供我们使用, 分页器中一共内置了三种分页方法: 简单分页、偏移分页、加密分页. 下面就一次介绍一下这几种分页方法的具体使用和区别
一 简单分页(查看第n页,每页显示n条)
-
使用情景较多, 具体使用方法和各个参数的说明如下
from rest_framework.pagination import PageNumberPagination
# 一 基本使用:url=url=http://127.0.0.1:8000/pager/?page=2&size=3,size无效
class Pager(APIView):
def get(self,request,*args,**kwargs):
# 获取所有数据
ret=models.Book.objects.all()
# 创建分页对象
page=PageNumberPagination()
# 在数据库中获取分页的数据
page_list=page.paginate_queryset(ret,request,view=self)
# 对分页进行序列化
ser=BookSerializer1(instance=page_list,many=True)
return Response(ser.data)
# 二 自定制 url=http://127.0.0.1:8000/pager/?page=2&size=3
# size=30,无效,最多5条
class Mypage(PageNumberPagination):
# 每页显示条数
page_size = 2
# 查询的页数码
page_query_param = 'page'
# 每页最大显示条数
page_size_query_param = 'size'
# 最大一页的数据/每页的最大显示条数(该参数是为了控制不合理的显示需求)
max_page_size = 5
class Pager(APIView):
def get(self,request,*args,**kwargs):
# 获取所有数据
ret=models.Book.objects.all()
# 创建分页对象
page=Mypage()
# 在数据库中获取分页的数据
page_list=page.paginate_queryset(ret,request,view=self)
# 对分页进行序列化
ser=BookSerializer1(instance=page_list,many=True)
# return Response(ser.data)
# 这个也是返回Response对象,但是比基本的多了上一页,下一页,和总数据条数(了解即可)
return page.get_paginated_response(ser.data)
setting配置
REST_FRAMEWORK = {
# 每页显示两条
'PAGE_SIZE':2
}
路由:
url(r'^pager/$', views.Pager.as_view()),
Serializers
class BookSerializer1(serializers.ModelSerializer):
class Meta:
model=models.Book
# fields="__all__"
exclude=('authors',)
二 偏移分页(在第n个位置,向后查看n条数据)
- 使用不如简单分页广泛,基本使用方法如下, 自定制的时候和简单分页相同,只是相关配置参数不同
自定制时的参数说明
-
default_limit = api_settings.PAGE_SIZE :默认偏移的条数 5
-
limit_query_param = 'limit' :偏移的条数
-
offset_query_param = 'offset' :是标杆
-
max_limit = None :最大偏移的条数
使用案例:
-http://127.0.0.1:8000/books/ 结果是:从1到5
-http://127.0.0.1:8000/books/?limit=7 结果是:从1到7
-http://127.0.0.1:8000/books/?limit=2&offset=6 结果是:从7到8,两条(从6之后偏移2个)
-http://127.0.0.1:8000/books/?offset=6 结果是:从7到11,5条(从6之后偏移5条)
# http://127.0.0.1:8000/pager/?offset=4&limit=3
from rest_framework.pagination import LimitOffsetPagination
# 也可以自定制,同简单分页
class Pager(APIView):
def get(self,request,*args,**kwargs):
# 获取所有数据
ret=models.Book.objects.all()
# 创建分页对象
page=LimitOffsetPagination()
# 在数据库中获取分页的数据
page_list=page.paginate_queryset(ret,request,view=self)
# 对分页进行序列化
ser=BookSerializer1(instance=page_list,many=True)
# return page.get_paginated_response(ser.data)
return Response(ser.data)
三 CursorPagination(加密分页,只能看上一页和下一页,速度快)
- 速度虽然是最快的, 但是只能往当前页之前一页或者之后一页走
- 也可以叫做游标分页, 他的原理是在第一次使用的时候,就会记住查询的数据共有多少条, 在使用的时候会以一个字段迅速进行索引到需要的页数然后往直前或者之后查询
自定制时的参数说明:
- cursor_query_param = 'cursor'
- page_size = api_settings.PAGE_SIZE :默认每页显示的条数
- ordering = 'id' :按谁排序(源码中默认是pk, 可以在这里和路由中的有名分组配合进行修改)
from rest_framework.pagination import CursorPagination
# 看源码,是通过sql查询,大于id和小于id
class Pager(APIView):
def get(self,request,*args,**kwargs):
# 获取所有数据
ret=models.Book.objects.all()
# 创建分页对象
page=CursorPagination()
page.ordering='nid'
# 在数据库中获取分页的数据
page_list=page.paginate_queryset(ret,request,view=self)
# 对分页进行序列化
ser=BookSerializer1(instance=page_list,many=True)
# 可以避免页码被猜到
return page.get_paginated_response(ser.data)
每天逼着自己写点东西,终有一天会为自己的变化感动的。这是一个潜移默化的过程,每天坚持编编故事,自己不知不觉就会拥有故事人物的特质的。 Explicit is better than implicit.(清楚优于含糊)