做用:数据库有几千万条数据,这些数据须要展现,咱们不可能直接从数据库把数据所有读取出来,这样会给内存形成特别大的压力,有可能还会内存溢出,因此咱们但愿一点一点的取,那展现的时候也是同样的,老是要进行分页显示,咱们以前本身都写过度页。python
在数据量特别大的时候,咱们的分页会越日后读取速度越慢,数据库
当有一千万条数据,我要看最后一页的内容的时候,怎么能让个人查询速度变快。加密
DRF提供的三种分页方式rest
from rest_framework.pagination import PageNumberPagination, LimitOffsetPagination, CursorPagination
全局配置code
REST_FRAMEWORK = { 'PAGE_SIZE': 2 }
class MyPageNumber(PageNumberPagination): page_size = 2 # 每页显示多少条 page_size_query_param = 'size' # URL中每页显示条数的参数 page_query_param = 'page' # URL中页码的参数 max_page_size = None # 最大页码数限制
view视图对象
class BookView(APIView): def get(self, request): book_list = Book.objects.all() # 分页 page_obj = MyPageNumber() page_article = page_obj.paginate_queryset(queryset=book_list, request=request, view=self) ret = BookSerializer(page_article, many=True) return Response(ret.data) # 返回带超连接 需返回的时候用内置的响应方法 # return page_obj.get_paginated_response(ret.data)
定义类内存
class MyLimitOffset(LimitOffsetPagination): # 默认每页显示的数据条数 default_limit = 10 # URL中传入的显示数据条数的参数 limit_query_param = 'limit' # URL中传入的数据位置的参数 offset_query_param = 'offset' # 最大每页显得条数 max_limit = None
视图get
# 视图和上面的大致一致 # 只有用的分页类不一样,其余都相同 class BookView(APIView): def get(self, request): book_list = Book.objects.all() # 分页 page_obj = MyLimitOffset() page_article = page_obj.paginate_queryset(queryset=book_list, request=request, view=self) ret = BookSerializer(page_article, many=True) # return Response(ret.data) # 返回带超连接 需返回的时候用内置的响应方法 return page_obj.get_paginated_response(ret.data)
定义类it
class MyCursorPagination(CursorPagination): # URL传入的游标参数 cursor_query_param = 'cursor' # 默认每页显示的数据条数 page_size = 2 # URL传入的每页显示条数的参数 page_size_query_param = 'page_size' # 每页显示数据最大条数 max_page_size = 1000 # 根据ID从大到小排列 ordering = "id"
视图io
class BookView(APIView): def get(self, request): book_list = Book.objects.all() # 实例化分页对象,获取数据库中的分页数据 page_obj = MyCursorPagination() page_article = page_obj.paginate_queryset(queryset=book_list, request=request, view=self) # 序列化对象 ret = BookSerializer(page_article, many=True) return Response(ret.data) # 生成分页和数据 # 返回带超连接 需返回的时候用内置的响应方法 # return page_obj.get_paginated_response(ret.data)