DRF 分页
DER分页
作用:数据库有几千万条数据,这些数据需要展示,我们不可能直接从数据库把数据全部读取出来,这样会给内存造成特别大的压力,有可能还会内存溢出,所以我们希望一点一点的取,那展示的时候也是一样的,总是要进行分页显示,我们之前自己都写过分页。
-
在数据量特别大的时候,我们的分页会越往后读取速度越慢,
当有一千万条数据,我要看最后一页的内容的时候,怎么能让我的查询速度变快。
-
DRF提供的三种分页方式
from rest_framework.pagination import PageNumberPagination, LimitOffsetPagination, CursorPagination
-
全局配置
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
-
视图
# 视图和上面的大体一致 # 只有用的分页类不同,其他都相同 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)
三 加密游标分页,把上一页和下一页的id记住
-
定义类
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"
-
视图
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)