drf7 分页组件

DRF的分页

数据库有几千万条数据,这些数据须要展现,不可能直接从数据库把数据所有读取出来,数据库

这样会给内存形成特别大的压力,有可能还会内存溢出,因此但愿一点一点的取,那展现的时候也是同样的,老是要进行分页显示,加密

DRF给提供了三种分页方式,看下他们都是什么样的~~url

分页组件的使用spa

DRF提供的三种分页rest

 

全局配置
REST_FRAMEWORK = {
    'PAGE_SIZE': 2
}

pageNumber分页

http://127.0.0.1:8000/book?page=2&size=1code

utils/pagination.py对象

自定义分页类blog

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

相关文章
相关标签/搜索