Django rest_framework 中分页可分为三类:

  • PageNumberPagination:看第 n 页,每页显示 n 条数据
  • LimitOffsetPagination:在 n 个位置,向后查看 n 条数据
  • CursorPagination:加密分页,只能看上一页和下一页

一、PageNumberPagination

在这里将采用 rest_framework 内置的页面渲染器 Response

1、api/serializers.py

  1. class PagesSerializers(serializers.ModelSerializer):
  2. """分页"""
  3. class Meta:
  4. model = models.Role
  5. fields = '__all__'

2、api/views.py

  1. from rest_framework.response import Response # 渲染器
  2. from .serializers import PagesSerializers
  3. from app import models
  4. from rest_framework.pagination import PageNumberPagination
  5. class PageView(APIView):
  6. """分页"""
  7. def get(self, request, *args, **kwargs):
  8. """示例:
  9. http://api.example.org/accounts/?page=4
  10. http://api.example.org/accounts/?page=4&page_size=100
  11. """
  12. roles = models.Role.objects.all()
  13. # 创建分页对象
  14. pg = PageNumberPagination()
  15. # 获取分页数据
  16. page_roles = pg.paginate_queryset(queryset=roles, request=request, view=self)
  17. # 将分页后的数据序列化
  18. roles_ser = PagesSerializers(instance=page_roles, many=True)
  19. # 将序列化后的数据渲染到前端显示,这里采用的是 rest_framework 的渲染器 Response
  20. return Response(roles_ser.data)

3、api/urls.py

  1. from django.urls import path, re_path
  2. from api.views import UserView, ParserView, RolesView, UserInfoView, GroupView, UserGroupView, PageView
  3. urlpatterns = [
  4. re_path('(?P<version>[v1|v2]+)/pages/', PageView.as_view()), # 分页
  5. ]

4、另外需要配置每页显示的条数 settings.py

  1. REST_FRAMEWORK = {
  2. "DEFAULT_VERSION": 'v1', # 默认的版本
  3. "ALLOWED_VERSIONS": ['v1', 'v2'], # 允许的版本
  4. "VERSION_PARAM": 'version', # GET方式url中参数的名字 ?version=xxx
  5. "PAGE_SIZE": 2, # 每页最多显示两条数据
  6. }

5、访问(第二页数据):http://127.0.0.1:8000/api/v2/pages/?page=2

自定义分页

定义一个类,让它继承 PageNumberPagination

1、api/views.py

  1. class MyPageNumberPagination(PageNumberPagination):
  2. """自定义分页类"""
  3. page_size = 2 # 每页最多显示的条数
  4. page_query_param = 'page' # 查询参数,URL 中的过滤参数
  5. # 通过 page_size 每页只显示 2 条,使用下面这个参数可以改变默认显示条数
  6. # 使用方法 http://127.0.0.1:8000/api/v2/pages/?page=2&size=3
  7. page_size_query_param = 'size'
  8. max_page_size = 10 # 最大页数
  9. class PageView(APIView):
  10. """分页"""
  11. def get(self, request, *args, **kwargs):
  12. """
  13. http://api.example.org/accounts/?page=4
  14. http://api.example.org/accounts/?page=4&page_size=100
  15. """
  16. roles = models.Role.objects.all()
  17. # 创建分页对象
  18. # pg = PageNumberPagination()
  19. pg = MyPageNumberPagination()
  20. # 获取分页数据
  21. page_roles = pg.paginate_queryset(queryset=roles, request=request, view=self)
  22. # 将分页后的数据序列化
  23. roles_ser = PagesSerializers(instance=page_roles, many=True)
  24. # 将序列化后的数据渲染到前端显示,这里采用的是 rest_framework 的渲染器 Response
  25. return Response(roles_ser.data)

2、访问:http://127.0.0.1:8000/api/v2/pages/?page=2&size=1

二、LimitOffsetPagination

LimitOffsetPagination 可以控制只查看多少条,以及偏移量 offset 后多少条数据,格式为:

  1. http://api.example.org/accounts/?limit=100 # 控制查看 100 条数据
  2. http://api.example.org/accounts/?offset=400&limit=100 # 偏移量 400,查看条数 100,即查看 400 后的 100 条数据

使用方法与 PageNumberPagination 一致:

  1. from rest_framework.pagination import PageNumberPagination, LimitOffsetPagination
  2. class PageView(APIView):
  3. """分页"""
  4. def get(self, request, *args, **kwargs):
  5. """
  6. http://api.example.org/accounts/?page=4
  7. http://api.example.org/accounts/?page=4&page_size=100
  8. """
  9. roles = models.Role.objects.all()
  10. # 创建分页对象
  11. # pg = PageNumberPagination()
  12. # pg = MyPageNumberPagination()
  13. pg = LimitOffsetPagination()
  14. # 获取分页数据
  15. page_roles = pg.paginate_queryset(queryset=roles, request=request, view=self)
  16. # 将分页后的数据序列化
  17. roles_ser = PagesSerializers(instance=page_roles, many=True)
  18. # 将序列化后的数据渲染到前端显示,这里采用的是 rest_framework 的渲染器 Response
  19. return Response(roles_ser.data)

查看第 2 条数据后的 3 条数据:

自定义

同样地 LimitOffsetPagination 也支持自定义:

  1. #自定义分页类2
  2. class MyLimitOffsetPagination(LimitOffsetPagination):
  3. #默认显示的个数
  4. default_limit = 2
  5. #当前的位置
  6. offset_query_param = "offset"
  7. #通过limit改变默认显示的个数
  8. limit_query_param = "limit"
  9. #一页最多显示的个数
  10. max_limit = 10

get_paginated_response() 方法控制前后页面

api/views.py

  1. class PageView(APIView):
  2. """分页"""
  3. def get(self, request, *args, **kwargs):
  4. """
  5. http://api.example.org/accounts/?page=4
  6. http://api.example.org/accounts/?page=4&page_size=100
  7. """
  8. roles = models.Role.objects.all()
  9. # 创建分页对象
  10. # pg = PageNumberPagination()
  11. # pg = MyPageNumberPagination()
  12. pg = LimitOffsetPagination()
  13. # 获取分页数据
  14. page_roles = pg.paginate_queryset(queryset=roles, request=request, view=self)
  15. # 将分页后的数据序列化
  16. roles_ser = PagesSerializers(instance=page_roles, many=True)
  17. # 将序列化后的数据渲染到前端显示,这里采用的是 rest_framework 的渲染器 Response
  18. # return Response(roles_ser.data)
  19. return pg.get_paginated_response(roles_ser.data) # 这一行

效果如下:

三、CursorPagination

CursorPagination 将页码进行加密,使得不能通过 URL 来控制显示的页面

1、这里使用自定义分页类 api/views.py

  1. class MyCursorPagination(CursorPagination):
  2. """自定义分页类"""
  3. page_size = 2 # 每页最多显示的条数
  4. cursor_query_param = 'cursor' # 查询参数,URL 中的过滤参数
  5. ordering = 'id' # 通过什么排序(正序)
  6. page_size_query_param = None
  7. max_page_size = None # 最大页数
  8. class PageView(APIView):
  9. """分页"""
  10. def get(self, request, *args, **kwargs):
  11. """
  12. http://api.example.org/accounts/?page=4
  13. http://api.example.org/accounts/?page=4&page_size=100
  14. """
  15. roles = models.Role.objects.all()
  16. # 创建分页对象
  17. # pg = PageNumberPagination()
  18. # pg = MyPageNumberPagination()
  19. # pg = LimitOffsetPagination()
  20. pg = MyCursorPagination()
  21. # 获取分页数据
  22. page_roles = pg.paginate_queryset(queryset=roles, request=request, view=self)
  23. # 将分页后的数据序列化
  24. roles_ser = PagesSerializers(instance=page_roles, many=True)
  25. # 将序列化后的数据渲染到前端显示,这里采用的是 rest_framework 的渲染器 Response
  26. # return Response(roles_ser.data)
  27. return pg.get_paginated_response(roles_ser.data)

2、访问: http://127.0.0.1:8000/api/v2/pages/

Django rest framework 之分页的更多相关文章

  1. Django Rest framework 之 分页

    RESTful 规范 django rest framework 之 认证(一) django rest framework 之 权限(二) django rest framework 之 节流(三) ...

  2. django rest framework实现分页功能

    在web开发中很多需求都需要实现分页功能,然而 Django Rest Framework 自带的分页功能,只能在 mixins.ListModelMixin and generics.Generic ...

  3. Django REST framework的分页

    DRF分页组件 为什么要使用分页 我们数据表中可能会有成千上万条数据,当我们访问某张表的所有数据时,我们不太可能需要一次把所有的数据都展示出来,因为数据量很大,对服务端的内存压力比较大还有就是网络传输 ...

  4. Django REST framework 之分页,视图,路由,渲染器

    1.分页 2.视图 3.路由 4.渲染器 1.分页 方法一: from django.shortcuts import render from rest_framework.versioning im ...

  5. Django Rest framework 之 序列化

    RESTful 规范 django rest framework 之 认证(一) django rest framework 之 权限(二) django rest framework 之 节流(三) ...

  6. Django Rest framework 之 解析器

    RESTful 规范 django rest framework 之 认证(一) django rest framework 之 权限(二) django rest framework 之 节流(三) ...

  7. Django Rest framework 之 版本

    RESTful 规范 django rest framework 之 认证(一) django rest framework 之 权限(二) django rest framework 之 节流(三) ...

  8. Django Rest framework 之 节流

    RESTful 规范 django rest framework 之 认证(一) django rest framework 之 权限(二) django rest framework 之 节流(三) ...

  9. Django Rest framework 之 权限

    django rest framework 之 认证(一) django rest framework 之 权限(二) django rest framework 之 节流(三) django res ...

随机推荐

  1. postman使用--Monitor

    前戏 现在我们已经能完成接口的批量执行,添加断言,数据驱动,设置变量等等方法.但是有一天,用户反应说我们的网站访问不了了.这时候,那帮程序猿查日志的查日志,看数据库的看数据库,找到原因在发布到线上已经 ...

  2. React - 组件:函数组件

    目录: . 组件名字首字母一定是大写的 . 返回一个jsx . jsx依赖React,所以组件内部需要引入React . 组件传参 a. 传递. <Component list={ arrDat ...

  3. 重启nova-scheduler服务,报错Login was refused using authentication mechanism AMQPLAIN

    问题描述 运行 systemctl restart openstack-nova-scheduler.service 失败,查看日志报错如下: 2019-12-22 14:52:27.426 1513 ...

  4. linux_权限小练习

    下面是解释: 当前# root用户, ls列出列表 mkdir 新建目录 赋予目录744权限      对others来说是  r--  只可读 touch 新建在目录下的同名文件 赋予文件600权限 ...

  5. 框架Ray

    高性能最终一致性框架Ray之基本概念原理 一.Actor介绍 Actor是一种并发模型,是共享内存并发模型的替代方案. 共享内存模型的缺点: 共享内存模型使用各种各样的锁来解决状态竞争问题,性能低下且 ...

  6. golang gRPC(持续更新)

    如何开启 gRPC 日志 设置 GRPC_GO_LOG_SEVERITY_LEVEL 环境变量, 可选项:["info", "warning", "e ...

  7. eclipse.ini相关问题

    一般新装的eclipse,在eclipse.ini文件中,有设置默认的内存信息,如果你要开发一个大的项目或者导入大的项目,那么,eclipse就会时不时报出这样的错误:An internal erro ...

  8. linux lnmp安装2个版本PHP教程

    linux lnmp安装2个版本PHP教程我原先装了5.6版本的PHP 后来想装个PHP7.0.14版本 一方面看看稳定性 另一方面看看性能怎么样 其实原理很简单 php-fpm开启了1个端口来管理P ...

  9. SSL密钥协商过程分析

    一.说明 尽管做过证书生成.双向认证.SSL通信编程等事情,但一直不清楚SSL如何完成密钥交换.看网上的资料则众说纷纭,最近和朋友学习时聊到了这个问题,然后正巧上周处理客户反馈SSL版本过低时领导也想 ...

  10. 031 Spring Data Elasticsearch学习笔记---重点掌握第5节高级查询和第6节聚合部分

    Elasticsearch提供的Java客户端有一些不太方便的地方: 很多地方需要拼接Json字符串,在java中拼接字符串有多恐怖你应该懂的 需要自己把对象序列化为json存储 查询到结果也需要自己 ...