首页 > 技术文章 > rest-framework之分页器

cao123 2018-12-18 20:15 原文

一 简单普通分页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)
                
            -丢到序列化类中,完成序列化,
            -最后返回
View Code

 

推荐阅读