drf7 分页组件

DRF分页详解
本文详细介绍了Django Rest Framework(DRF)中实现大数据分页的三种方式:pageNumber分页、limitOffset分页和CursorPagination游标分页。通过自定义分页类,展示了如何在视图中应用这些分页策略,有效解决大量数据展示时的内存压力问题。

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值