Django Rest framework三种分页方式详解


Posted in Python onJuly 26, 2019

前言

我们数据库有几千万条数据,这些数据需要展示,我们不可能直接从数据库把数据全部读取出来.
因为这样会给内存造成巨大的压力,很容易就会内存溢出,所以我们希望一点一点的取.

同样,展示的时候也是一样的,我们必定会对数据进行分页显示.

本文将详细讲述DRF为我们提供的三种分页方式.

全局配置

REST_FRAMEWORK = {
  # 对所有分页器生效,但优先级低
  'PAGE_SIZE': 5, # 每页显示5条数据
}

我们先准备好用于测试分页的数据以及序列化类
数据表

from django.db import models

class Test(models.Model):
  """用于测试分页的数据表"""
  name = models.CharField(max_length=64)

生成表记录:

# 在Python脚本中调用Django环境
import os

if __name__ == '__main__':
  # 将下面的'blog095.settings'改为项目对应的名称后直接执行即可生成记录
  os.environ.setdefault('DJANGO_SETTINGS_MODULE', > 'blog095.settings')
  import django
  django.setup()
  from blog.models import Test # 导入数据表
  [Test.objects.create(name="花千骨%s" % str(i)) for i in range(100)]

序列化类

from rest_framework.serializers import ModelSerializer
from blog.models import Test # 导入数据表

class TestSerializer(ModelSerializer):
  """用于测试分页的序列化类"""
  class Meta:
    model = Test
    fields = '__all__'

第一种 PageNumberPagination 查第n页,每页显示n条数据

第一步 分页器配置文件

from rest_framework import pagination

class PageNumberPagination(pagination.PageNumberPagination):
  """查第n页,每页显示n条数据"""
  page_size = 10 # 指定每页显示多少条数据
  page_size_query_param = 'size' # URL参数中每页显示条数的参数
  page_query_param = 'page' # URL中页码的参数
  max_page_size = None # 每页最多显示多少条数据

第二步 视图文件

from rest_framework.response import Response
from rest_framework.views import APIView
from rest_framework.serializers import ModelSerializer
from blog.models import Test # 导入数据表
from blog import pagination # 导入上面的分页配置

class Test01View(APIView):
  def get(self, request):
    queryset = Test.objects.all()

    # 1. 实例化分页器对象
    page_obj = pagination.PageNumberPagination()

    # 2. 使用自己配置的分页器调用分页方法进行分页
    page_data = page_obj.paginate_queryset(queryset, request)

    # 3. 序列化我们分页好的数据
    ser_obj = TestSerializer(page_data, many=True)

    # # 4. 返回数据
    # return Response(ser_obj.data)

    # 4. 返回带上一页/下一页连接的页面
    return page_obj.get_paginated_response(ser_obj.data)

第三步 访问测试

Django Rest framework三种分页方式详解

如上图,指定page=10&size=5后,返回了相应的数据.
***

第二种 LimitOffsetPagination 在第n个位置,向后查n条数据

第一步 分页器配置文件

from rest_framework import pagination

class LimitOffsetPagination(pagination.LimitOffsetPagination):
  """在第n个位置,向后查n条数据"""
  default_limit = 1 # 指定默认查多少条数据
  limit_query_param = 'limit' # URL中指定查多少条数据的参数
  offset_query_param = 'offset' # URL中指定从第几条数据开始查的参数
  max_limit = 999 # 最大显示多少条数据

第二步 视图文件

from rest_framework.response import Response
from rest_framework.views import APIView
from rest_framework.serializers import ModelSerializer
from blog.models import Test # 导入数据表
from blog.pagination import LimitOffsetPagination # 导入上面的分页配置


class Test02View(APIView):
  def get(self, request):
    queryset = Test.objects.all()

    # 1. 实例化分页器对象
    page_obj = LimitOffsetPagination()

    # 2. 使用自己配置的分页器调用分页方法进行分页
    page_data = page_obj.paginate_queryset(queryset, request)

    # 3. 序列化我们分页好的数据
    ser_obj = TestSerializer(page_data, many=True)

    # # 4. 返回数据
    # return Response(ser_obj.data)

    # 4. 返回带上一页/下一页连接的页面
    return page_obj.get_paginated_response(ser_obj.data)

第三步 访问测试

Django Rest framework三种分页方式详解

***

第三种 CursorPagination 加密游标的分页

第一步 分页器配置文件

from rest_framework import pagination

class CursorPagination(pagination.CursorPagination):
  """加密游标的分页"""
  cursor_query_param = 'cursor' # 游标(这是加密的游标)
  # ordering = '-id' # 从后往前取数据
  ordering = 'id'
  page_size = 1 # 每页显示的条数

第二步 视图文件

from rest_framework.response import Response
from rest_framework.views import APIView
from rest_framework.serializers import ModelSerializer
from blog.models import Test # 导入数据表
from blog.pagination import CursorPagination # 导入上面的分页配置

class Test03View(APIView):
  def get(self, request):
    queryset = Test.objects.all()

    # 1. 实例化分页器对象
    page_obj = CursorPagination()

    # 2. 使用自己配置的分页器调用分页方法进行分页
    page_data = page_obj.paginate_queryset(queryset, request)

    # 3. 序列化我们分页好的数据
    ser_obj = TestSerializer(page_data, many=True)

    # # 4. 返回数据
    # return Response(ser_obj.data)

    # 4. 返回带上一页/下一页连接的页面
    return page_obj.get_paginated_response(ser_obj.data)

好了,打开浏览器去测试吧.

还可以使用DRF视图系统生成带有上一页/下一页按钮的页面.

from rest_framework.viewsets import ModelViewSet

class Test04View(ModelViewSet):
  queryset = Test.objects.all()
  serializer_class = TestSerializer
  pagination_class = CursorPagination # 指定分页配置器

如下图:

Django Rest framework三种分页方式详解

is ok.

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python求众数问题实例
Sep 26 Python
用python读写excel的方法
Nov 18 Python
Pyhton中单行和多行注释的使用方法及规范
Oct 11 Python
python 系统调用的实例详解
Jul 11 Python
python生成圆形图片的方法
Mar 25 Python
python使用KNN算法手写体识别
Feb 01 Python
Python 反转字符串(reverse)的方法小结
Feb 20 Python
Python实现的redis分布式锁功能示例
May 29 Python
对python 多个分隔符split 的实例详解
Dec 20 Python
pandas 缺失值与空值处理的实现方法
Oct 12 Python
django中间键重定向实例方法
Nov 10 Python
python中round函数如何使用
Jun 19 Python
浅析Windows 嵌入python解释器的过程
Jul 26 #Python
python flask几分钟实现web服务的例子
Jul 26 #Python
解决python flask中config配置管理的问题
Jul 26 #Python
Django REST framework内置路由用法
Jul 26 #Python
python flask web服务实现更换默认端口和IP的方法
Jul 26 #Python
Django 开发环境与生产环境的区分详解
Jul 26 #Python
python3发送邮件需要经过代理服务器的示例代码
Jul 25 #Python
You might like
PHP与已存在的Java应用程序集成
2006/10/09 PHP
CodeIgniter与PHP5.6的兼容问题
2015/07/16 PHP
扩展String功能方法
2006/09/22 Javascript
从sohu弄下来的flash中展示图片的代码
2007/04/27 Javascript
jquery实现居中弹出层代码
2010/08/25 Javascript
自己使用jquery写的一个无缝滚动的插件
2014/04/30 Javascript
Javascript中this的用法详解
2014/09/22 Javascript
JavaScript中的全局对象介绍
2015/01/01 Javascript
全面了解JavaScript对象进阶
2016/07/19 Javascript
关于动态执行代码(js的Eval)实例详解
2016/08/15 Javascript
jQuery Checkbox 全选 反选的简单实例
2016/11/29 Javascript
vue.js利用Object.defineProperty实现双向绑定
2017/03/09 Javascript
JavaScript 下载svg图片为png格式
2018/06/21 Javascript
JavaScript引用类型Array实例分析
2018/07/24 Javascript
[00:53]TI3正赛第三天 DK怒破A队不败金身 现场国旗飘扬热血激昂
2013/08/10 DOTA
[00:14]护身甲盾
2019/03/06 DOTA
python中sys.argv参数用法实例分析
2015/05/20 Python
python脚本监控docker容器
2016/04/27 Python
python3实现跳一跳点击跳跃
2018/01/08 Python
python实现批量修改图片格式和尺寸
2018/06/07 Python
Python 十六进制整数与ASCii编码字符串相互转换方法
2018/07/09 Python
pandas使用get_dummies进行one-hot编码的方法
2018/07/10 Python
Python二进制串转换为通用字符串的方法
2018/07/23 Python
基于python实现微信好友数据分析(简单)
2020/02/16 Python
分享29个基于Bootstrap的HTML5响应式网页设计模板
2015/11/19 HTML / CSS
工商管理专业实习生自我鉴定
2013/09/29 职场文书
市场营销专业大学生职业生涯规划文
2014/03/06 职场文书
2014年小学重阳节活动策划方案
2014/09/16 职场文书
检讨书格式
2015/01/23 职场文书
接收函格式
2015/01/30 职场文书
世界水日宣传活动总结
2015/02/09 职场文书
小学教研工作总结2015
2015/05/13 职场文书
Go语言并发编程 sync.Once
2021/10/16 Golang
Rust 连接 PostgreSQL 数据库的详细过程
2022/01/22 PostgreSQL
《异世界四重奏》剧场版6月10日上映 PV视觉图原创角色发表
2022/03/20 日漫
python blinker 信号库
2022/05/04 Python