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进阶-函数默认参数(详解)
May 18 Python
Python numpy 点数组去重的实例
Apr 18 Python
python实现文本进度条 程序进度条 加载进度条 单行刷新功能
Jul 03 Python
pandas的连接函数concat()函数的具体使用方法
Jul 09 Python
python实现函数极小值
Jul 10 Python
用Python实现最速下降法求极值的方法
Jul 10 Python
Python字典常见操作实例小结【定义、添加、删除、遍历】
Oct 25 Python
python3 Scrapy爬虫框架ip代理配置的方法
Jan 17 Python
Python实现RabbitMQ6种消息模型的示例代码
Mar 30 Python
Python操作Elasticsearch处理timeout超时
Jul 17 Python
Pytorch中TensorBoard及torchsummary的使用详解
May 12 Python
Python学习之时间包使用教程详解
Mar 21 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中get_headers函数的作用及用法的详细介绍
2013/04/27 PHP
thinkphp连贯操作实例分析
2014/11/22 PHP
php编译安装php-amq扩展简明教程
2016/06/25 PHP
ThinkPHP5与单元测试PHPUnit使用详解
2020/02/23 PHP
javascript之大字符串的连接的StringBuffer 类
2007/05/08 Javascript
使用JS进行目录上传(相当于批量上传)
2010/12/05 Javascript
jQuery实现判断滚动条到底部
2015/06/23 Javascript
JavaScript中获取Radio被选中的值
2015/11/11 Javascript
javascript轻量级库createjs使用Easel实现拖拽效果
2016/02/19 Javascript
JavaScript 用fetch 实现异步下载文件功能
2017/07/21 Javascript
JS实现的贪吃蛇游戏完整实例
2019/01/18 Javascript
JS控制只能输入数字并且最多允许小数点两位
2019/11/24 Javascript
浅析Vue 中的 render 函数
2020/02/28 Javascript
JQuery通过键盘控制键盘按下与松开触发事件
2020/08/07 jQuery
vue-cli3访问public文件夹静态资源报错的解决方式
2020/09/02 Javascript
JS绘图Flot如何实现可选显示曲线图功能
2020/10/16 Javascript
JavaScript TAB栏切换效果的示例
2020/11/05 Javascript
[01:02:02]DOTA2上海特级锦标赛A组败者赛 EHOME VS CDEC第二局
2016/02/25 DOTA
Python实现二叉堆
2016/02/03 Python
Python正则替换字符串函数re.sub用法示例
2017/01/19 Python
彻彻底底地理解Python中的编码问题
2018/10/15 Python
Python实现简单层次聚类算法以及可视化
2019/03/18 Python
Centos7 下安装最新的python3.8
2019/10/28 Python
python函数局部变量、全局变量、递归知识点总结
2019/11/15 Python
关于Theano和Tensorflow多GPU使用问题
2020/06/19 Python
用OpenCV进行年龄和性别检测的实现示例
2021/01/29 Python
HTML5新增加的功能详解
2016/09/05 HTML / CSS
美国高档百货Nordstrom的折扣店:Nordstrom Rack
2017/11/13 全球购物
adidas澳大利亚官方网站:adidas Australia
2018/04/15 全球购物
澳大利亚珠宝商:Shiels
2019/10/06 全球购物
工商管理毕业生推荐信
2013/12/24 职场文书
教师民族团结演讲稿
2014/08/27 职场文书
幼儿园小班家长评语
2014/12/30 职场文书
业务员年终工作总结2015
2015/05/28 职场文书
Python实现byte转integer
2021/06/03 Python
教你用Python+selenium搭建自动化测试环境
2021/06/18 Python