DRF的分页
数据库有几千万条数据,这些数据需要展示,不可能直接从数据库把数据全部读取出来,
这样会给内存造成特别大的压力,有可能还会内存溢出,所以希望一点一点的取,那展示的时候也是一样的,总是要进行分页显示,
DRF给提供了三种分页方式,看下他们都是什么样的~~
分页组件的使用
DRF提供的三种分页
全局配置 REST_FRAMEWORK = { 'PAGE_SIZE': 2 }
pageNumber分页
http://127.0.0.1:8000/book?page=2&size=1
utils/pagination.py
自定义分页类
from rest_framework.pagination import PageNumberPagination, LimitOffsetPagination, CursorPagination class MyPagination(PageNumberPagination): # xxxx?page=1&size=2 page_size = 1 page_query_param = "page" page_size_query_param = "size" max_page_size = 3
pageDemo/views.py
from utils.pagination import MyPagination class BookView(APIView): def get(self, request): queryset = Book.objects.all() # 1,实例化分页器对象 page_obj = MyPagination() # 2,调用分页方法去分页queryset page_queryset = page_obj.paginate_queryset(queryset, request, view=self) # 3,把分页好的数据序列化返回
ser_obj = BookSerializer(page_queryset, many=True) # 4, 带着上一页下一页连接的响应,返回带超链接 需返回的时候用内置的响应方法 return page_obj.get_paginated_response(ser_obj.data) #超链接
# return Response(ret.data)
limitOffset分页
自定义分页类
class MyPagination(LimitOffsetPagination): default_limit = 1 limit_query_param = "limit" # 向后找多少条 offset_query_param = "offset" # 从第几个开始找 max_limit = 3
视图
# 视图和上面的大体一致 # 只有用的分页类不同,其他都相同 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)
CursorPagination游标分页
加密游标的分页 把上一页和下一页的id记住
自定义分页类
class MyPagination(CursorPagination): cursor_query_param = "cursor" page_size = 2 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)
对url进行了加密,还支持对数据排序
7