zoukankan      html  css  js  c++  java
  • Django REST framework基础:分页

    Django REST framework基础:分页

     

    DRF分页组件

    为什么要使用分页

    我们数据表中可能会有成千上万条数据,当我们访问某张表的所有数据时,我们不太可能需要一次把所有的数据都展示出来,因为数据量很大,对服务端的内存压力比较大还有就是网络传输过程中耗时也会比较大。

    通常我们会希望一部分一部分去请求数据,也就是我们常说的一页一页获取数据并展示出来。

    DRF使用分页器

    分页模式

    rest framework中提供了三种分页模式:

    from rest_framework.pagination import PageNumberPagination, LimitOffsetPagination, CursorPagination

    全局配置

    REST_FRAMEWORK = {
        'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.LimitOffsetPagination',
        'PAGE_SIZE': 100
    }

    局部配置

    我们可以在视图类中进行局部设置

    class PublisherViewSet(ModelViewSet):
    queryset = models.Publisher.objects.all()
    serializer_class = PublisherModelSerializer
    pagination_class = PageNumberPagination # 注意不是列表(只能有一个分页模式)

    DRF内置分页器

    PageNumberPagination

    按页码数分页,第n页,每页显示m条数据

    例如:http://127.0.0.1:8000/api/article/?page=2&size=1

    分页器

    class MyPageNumber(PageNumberPagination):
        page_size = 2  # 每页显示多少条
        page_size_query_param = 'size'  # URL中每页显示条数的参数
        page_query_param = 'page'  # URL中页码的参数
        max_page_size = None  # 最大页码数限制

    视图

    复制代码
    class ArticleList(APIView):
        def get(self, request, *args, **kwargs):
            res = {"code": 0}
            article_list = models.Article.objects.all().order_by("id")
            # 分页
            page_obj = MyPageNumber()
            page_article = page_obj.paginate_queryset(queryset=article_list, request=request, view=self)
            ser_obj = ArticleSerializer(page_article, many=True)
            res["data"] = ser_obj.data
            return Response(res)
    复制代码

    返回带页码链接的响应

    复制代码
    class ArticleList(APIView):
        def get(self, request, *args, **kwargs):
            res = {"code": 0}
            article_list = models.Article.objects.all().order_by("id")
            # 分页
            page_obj = MyPageNumber()
            page_article = page_obj.paginate_queryset(queryset=article_list, request=request, view=self)
            ser_obj = ArticleSerializer(page_article, many=True)
            res["data"] = ser_obj.data
            return page_obj.get_paginated_response(res)
    复制代码

    LimitOffsetPagination 

    分页,在n位置,向后查看m条数据

    例如:http://127.0.0.1:8000/api/article/?offset=2&limit=2

    分页器

    # offset分页
    class MyLimitOffset(LimitOffsetPagination):
        default_limit = 1
        limit_query_param = 'limit'
        offset_query_param = 'offset'
        max_limit = 999

    视图

    复制代码
    class ArticleList(APIView):
        def get(self, request, *args, **kwargs):
            res = {"code": 0}
            article_list = models.Article.objects.all().order_by("id")
            # 分页
            page_obj = MyLimitOffset()
            page_article = page_obj.paginate_queryset(queryset=article_list, request=request, view=self)
            ser_obj = ArticleSerializer(page_article, many=True)
            res["data"] = ser_obj.data
            return page_obj.get_paginated_response(res)
    复制代码

    CursorPagination

    加密分页,把上一页和下一页的id值记住

    分页器

    # 加密分页
    class MyCursorPagination(CursorPagination):
        cursor_query_param = 'cursor'
        page_size = 1
        ordering = '-id'  # 重写要排序的字段

    视图

    复制代码
    class ArticleList(APIView):
        def get(self, request, *args, **kwargs):
            res = {"code": 0}
            article_list = models.Article.objects.all().order_by("id")
            # 分页
            page_obj = MyCursorPagination()
            page_article = page_obj.paginate_queryset(queryset=article_list, request=request, view=self)
            ser_obj = ArticleSerializer(page_article, many=True)
            res["data"] = ser_obj.data
            # return Response(res)
            return page_obj.get_paginated_response(res)
    复制代码
  • 相关阅读:
    php大力力 [048节] php一点支付开发资料,很散
    php大力力 [047节] 寻找程序员的方法和应用
    ECharts的简单使用
    xlsxwriter新建Excel文件-制图
    xlsxwriter新建Excel文件
    xlrd读取Excel文件
    抽奖概率互斥算法
    Redis 的 8 大数据类型!
    Django Web框架入门-博客(更新完成)
    Git学习
  • 原文地址:https://www.cnblogs.com/PythonMrChu/p/10439965.html
Copyright © 2011-2022 走看看