DRF--分页

简介: 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  # 每页显示两条

相关文章
|
1月前
|
前端开发
bladex自定义分页
bladex自定义分页
21 0
|
3月前
|
JavaScript 数据库 Python
django实现增删改查分页接口
django实现增删改查分页接口
|
1月前
|
前端开发 JavaScript
vue实现通用分页控件,支持前端分页、后端分页。
vue实现通用分页控件,支持前端分页、后端分页。
38 1
|
8月前
|
前端开发 安全 API
DRF--介绍和安装
DRF--介绍和安装
|
9月前
|
SQL Oracle 关系型数据库
什么是分页?如何使用分页?(一)
什么是分页?如何使用分页?
114 0
|
8月前
|
XML JSON 前端开发
DRF--解析器Parsers
DRF--解析器Parsers
|
9月前
|
SQL 存储 关系型数据库
什么是分页?如何使用分页?(二)
什么是分页?如何使用分页?
52 0
|
PHP
PHP:laravel自定义分页page查询方法
PHP:laravel自定义分页page查询方法
88 0
|
JavaScript 搜索推荐 前端开发
【自然框架】QuickPager分页控件,新增一种分页方式——伪URL分页(Postback版)
适用场景   先说一下伪URL分页的适用场景。在网站的网页里实现查询功能,如果查询条件比较少的话,还比较好办,把查询条件放到URL里面传递即可。但是如果查询条件过多,就会照成URL的长度过长。既不好看,编写起来也很麻烦。
1130 0
|
SQL
分页解决方案 之 QuickPager的使用方法(PostBack分页、自定义获取数据)
        适用范围:网站后台管理、OA、CRM、CMS等,从关系型数据库里提取数据,或者XML等获取数据,不愿意使用Pager_SQL、DataAccessLibrary的情况。       优点:可以使用自己喜欢的方式获取数据,不仅仅限于关系型数据库,其他的也都可以。
831 0

热门文章

最新文章