drf7 分页组件

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)

image

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)

image

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进行了加密,还支持对数据排序

image

7

原文地址:https://www.cnblogs.com/wenyule/p/10440738.html