zoukankan      html  css  js  c++  java
  • DRF--分页

    前戏

    当我们的数据有上万条的时候,我们不可能把所有的数据都返回给前端,肯定是每页显示多少条这样的显示在前端,这样方便用户的查看。DRF提供了我们三种分页的方法,

    第一种 PageNumberPagination  看第n页,每页显示n条数据,第二种 LimitOffsetPagination 在第n个位置  向后查看n条数据,第三种 CursorPagination 加密游标的分页 把上一页和下一页的id记住。

    这三种方法都可以在pagination类里查看到

    from rest_framework.pagination import PageNumberPagination, LimitOffsetPagination, CursorPagination

    PageNumberPagination

    在项目根目录下创建一个utils目录,在里面创建一个pagination.py文件,里面配置我们的分页类,类继承了PageNumberPagination类

    from rest_framework import pagination
    
    class MyPaginator(pagination.PageNumberPagination):
        page_size = 2  # 每页显示两条
        page_query_param = 'page'  # 页数的参数名为page
        page_size_query_param = 'size'  # 条数的参数为size
        max_page_size = 3  # 每页的条数最大不超过3条

    在写我们的视图函数

    from utils.pagination import MyPaginator
    
    
    class PageBookView(APIView):
        def get(self, request):
            queryset = Book.objects.all()
            # 先实例化分页器对象
            page_obj = MyPaginator()
            # 用我自己的分页器调用分页方法进行分页
            page_data = page_obj.paginate_queryset(queryset, request)
            # 序列化我们分页好的数据
            ser_obj = BookSerializer(page_data, many=True)
            return Response(ser_obj.data)

    访问如下的路径:http://127.0.0.1:8000/api/page_book/?page=2&size=3 表示查询第二页的数据,显示三条

    这样查询出来的是没有上一页和下一页的,如果想要上一页和下一页的链接,只需要改return后面的就可以了

    from utils.pagination import MyPaginator
    
    class PageBookView(APIView):
        def get(self, request):
            queryset = Book.objects.all()
            # 先实例化分页器对象
            page_obj = MyPaginator()
            # 用我自己的分页器调用分页方法进行分页
            page_data = page_obj.paginate_queryset(queryset, request)
            # 序列化我们分页好的数据
            ser_obj = BookSerializer(page_data, many=True)
            # 给响应添加上一页和下一页链接
            return page_obj.get_paginated_response(ser_obj.data)

     这是我们自己写的view视图,在前几篇博客中,DRF提供了我们更简单的方法返回数据,只需要提供queryset和serializer_class就可以了,比如下面的这种

    class BookModelView(viewsets.ModelViewSet):
        queryset = Book.objects.all()
        serializer_class = BookSerializer

    这样不管你是什么请求,都能处理。DRF也提供了我们分页的功能,只需要加pagination_class,后面写我们自己配置的分页类就可以了

    from utils.pagination import MyPaginator
    
    
    class BookModelView(viewsets.ModelViewSet):
        queryset = Book.objects.all()
        serializer_class = BookSerializer
        pagination_class = MyPaginator  # 我们自己配置的分页类

    只需要这样简单的配置一下就可以完成和上面一样的功能。

    LimitOffsetPagination

    LimitOffsetPagination 在第n个位置  向后查看n条数据

    在我们的pagination.py文件里,在写个LimitOffsetPagination的类

    from rest_framework import pagination
    
    
    class LimitOffsetPaginator(pagination.LimitOffsetPagination):
        default_limit = 1  # 默认显示的条数
        limit_query_param = 'limit'  # url里显示条数的参数名
        offset_query_param = 'offset'  # url里显示偏移位置的参数名

    视图和上面的类似,只需要更改配置的分页类就可以了

    from utils.pagination import  LimitOffsetPaginator
    
    
    class PageBookView(APIView):
        def get(self, request):
            queryset = Book.objects.all()
            # 先实例化分页器对象
            page_obj = LimitOffsetPaginator()   改这里就可以了
            # 用我自己的分页器调用分页方法进行分页
            page_data = page_obj.paginate_queryset(queryset, request)
            # 序列化我们分页好的数据
            ser_obj = BookSerializer(page_data, many=True)
            return Response(ser_obj.data)

    使用DRF的视图

    from utils.pagination import  LimitOffsetPaginator
    
    
    class BookModelView(viewsets.ModelViewSet):
    
        queryset = Book.objects.all()
        serializer_class = BookSerializer
        pagination_class = LimitOffsetPaginator  # 我们自己配置的分页类

    路径:http://127.0.0.1:8000/api/book/?limit=2&offset=3,后面的参数offset表示从第3个后开始,limit表示显示两个。比如,数据库里的内容为5,6,7,8,9,则显示的为8和9

    CursorPagination

    CursorPagination 加密游标的分页 把上一页和下一页的id记住。

    在我们的pagination.py文件里,在写个CursorPaginatior的类

    from rest_framework import pagination
    
    
    class CursorPaginatior(pagination.CursorPagination):
        cursor_query_param = 'cursor'
        ordering = '-id'  # 按id降序排
        page_size = 2  # 每页显示两条

    视图和上面的类似

    from utils.pagination import CursorPaginatior
    
    
    class BookModelView(viewsets.ModelViewSet):
    
        queryset = Book.objects.all()
        serializer_class = BookSerializer
        pagination_class = CursorPaginatior  # 我们自己配置的分页类

     总结

    DRF提供我们的三种分页方法我们都已经会了,最后再看一下三种分页类的配置

    from rest_framework import pagination
    
    
    class MyPaginator(pagination.PageNumberPagination):
        page_size = 2  # 每页显示两条
        page_query_param = 'page'  # 页数的参数名为page
        page_size_query_param = 'size'  # 条数的参数为size
        max_page_size = 3  # 每页的条数最大不超过3条
    
    
    class LimitOffsetPaginator(pagination.LimitOffsetPagination):
        default_limit = 1  # 默认显示的条数
        limit_query_param = 'limit'  # url里显示条数的参数名
        offset_query_param = 'offset'  # url里显示偏移位置的参数名
    
    
    class CursorPaginatior(pagination.CursorPagination):
        cursor_query_param = 'cursor'
        ordering = '-id'  # 按id降序排
        page_size = 2  # 每页显示两条
  • 相关阅读:
    ios framework 使用图片资源
    XCode 6.4 Alcatraz 安装的插件不可用
    prefix pch 中引用cocoapods 中的头文件失败
    Xcode 6添加模板无效
    获取当前日期是星期几
    玩转iOS开发:《使用系统自带的UIActivityViewController和UIActivity进行内容分享》
    玩转iOS开发:《iOS设计模式 — 代理模式》
    玩转iOS开发:《iOS设计模式 — 单例模式》
    iOS开发技巧-Swift版本: 3.Storyboard传参小技巧
    UIKit应用
  • 原文地址:https://www.cnblogs.com/zouzou-busy/p/11588193.html
Copyright © 2011-2022 走看看