一 简单普通分页PageNumberPagination(查看第n页,每页显示n条)
第一种:类似于原来django中的分页
from rest_framework.views import APIView from rest_framework.viewsets import ViewSetMixinfrom app01 import MySer
from rest_framework.pagination import PageNumberPagination
# 每页显示3条,每页的显示条数(默认)
page_size = 3
# 查询的key,问好后面的key,查询的时候,按哪个字段查
page_query_param = 'aa'
# 指定当前页显示多少条,当前页的每页大小(用户指定的)
page_size_query_param = 'size'
# 每页最多显示3条,每页显示最大条数
max_page_size = 3
class Book(ViewSetMixin, APIView): def get_all(self, request): response = {'status': 100, 'msg': '查询成功'} book_list = models.Book.objects.all() # 实例化产生一个分页对象 page = PageNumberPagination() # 不继承来修改对象的值 page.page_size=2 page.page_query_param='bb' # page = MyPageNumberPagination() # 第一个参数:要分页的数据,第二个参数:request对象,第三个参数:当前的视图对象 page_list = page.paginate_queryset(book_list, request, self) # 再序列化的时候,用分页之后的数据 ser = MySer.BookSerializers(instance=page_list, many=True) response['data'] = ser.data # return Response(response) # 会带着链接,和总共的条数,不建议使用 return page.get_paginated_response(ser.data) # return Response(ser.data)
setting里
REST_FRAMEWORK = { # 每页显示两条 'PAGE_SIZE':2 }
二 偏移分页LimitOffsetPagination(在第n个位置,向后查看n条数据)
#每页显示的条数 default_limit = api_settings.PAGE_SIZE #标杆值,当前所在的条数 offset_query_param = 'offset' #往后偏移多少条数 limit_query_param = 'limit' #每页显示最大的条数 max_limit = None
****要取的条数,如果超过了,还剩多少,就显示多少
# 偏移分页
from rest_framework.pagination import LimitOffsetPagination
class Book(ViewSetMixin, APIView):
def get_all(self, request):
response = {'status': 100, 'msg': '查询成功'}
book_list = models.Book.objects.all()
# 实例化产生一个偏移分页的对象
page = LimitOffsetPagination()
# 每页显示3条
page.default_limit = 3
# 每页显示的最大条数
page.max_limit = 4
page_list = page.paginate_queryset(book_list, request, self)
ser = MySer.BookSerializers(instance=page_list, many=True)
return Response(ser.data)
三.加密分页CursorPagination(只能看上一页和下一页,查询速度快)
# 加密分页,只能上一页下一页的翻,不能指定要到哪一页
加密分页(查询速度快)
#按nid排序
page.ordering = 'nid'
#查询的key值
cursor_query_param = 'cursor'
#每页显示多少条
page_size = api_settings.PAGE_SIZE
from rest_framework.pagination import CursorPagination class Book(ViewSetMixin, APIView): def get_all(self, request): response = {'status': 100, 'msg': '查询成功'} book_list = models.Book.objects.all() # 实例化产生一个加密分页的对象 page = CursorPagination() # 按nid排序 page.ordering='nid' page_list = page.paginate_queryset(book_list, request, self) # 丢到序列化类中,完成序列化 ser = MySer.BookSerializers(instance=page_list, many=True) # 最后返回数据 return page.get_paginated_response(ser.data)
分页总结使用:
分页器 三种分页: 第一种:类似于原来django中的分页 -page_size = api_settings.PAGE_SIZE -page_query_param = 'page' -page_size_query_param -max_page_size 第二种:偏移分页 #每页显示的条数 default_limit = api_settings.PAGE_SIZE #标杆值 offset_query_param = 'offset' #往后偏移多少 limit_query_param = 'limit' #每页显示最大的条数 max_limit = None ****要取的条数,如果超过了,还剩多少,就显示多少 第三种:加密分页(查询速度快) #按nid排序 page.ordering = 'nid' #查询的key值 cursor_query_param = 'cursor' #每页显示多少条 page_size = api_settings.PAGE_SIZE 使用: -生成一个对象(普通,偏移,加密) --***重点:可以修改对象的属性 -ret=对象.paginate_queryset(book_list, request, self) -丢到序列化类中,完成序列化, -最后返回