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 字符串格式化代码
Mar 17 Python
详解Python中的动态属性和特性
Apr 07 Python
python删除本地夹里重复文件的方法
Nov 19 Python
Python get获取页面cookie代码实例
Sep 12 Python
浅谈python写入大量文件的问题
Nov 09 Python
python微信聊天机器人改进版(定时或触发抓取天气预报、励志语录等,向好友推送)
Apr 25 Python
Django自定义用户登录认证示例代码
Jun 30 Python
Python实现变声器功能(萝莉音御姐音)
Dec 05 Python
Python简单实现区域生长方式
Jan 16 Python
Python简单实现词云图代码及步骤解析
Jun 04 Python
python+django+selenium搭建简易自动化测试
Aug 19 Python
利用Python判断你的密码难度等级
Jun 02 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文件管理基本功能简单操作
2017/01/16 PHP
Laravel如何使用Redis共享Session
2018/02/23 PHP
JavaScript OOP类与继承
2009/11/15 Javascript
JS刷新框架外页面七种实现代码
2013/02/18 Javascript
JavaScript 实现类的多种方法实例
2013/05/01 Javascript
JavaScript中用getDate()方法返回指定日期的教程
2015/06/09 Javascript
JavaScript实现删除,移动和复制文件的方法
2015/08/05 Javascript
jQuery实现带延时功能的水平多级菜单效果【附demo源码下载】
2016/09/21 Javascript
原生js实现弹出层登录拖拽功能
2016/12/05 Javascript
AngularJS路由实现页面跳转实例
2017/03/03 Javascript
JS实现数组按升序及降序排列的方法
2017/04/26 Javascript
Three.js利用Detector.js插件如何实现兼容性检测详解
2017/09/26 Javascript
AngularJS2 与 D3.js集成实现自定义可视化的方法
2017/12/01 Javascript
Angular 4.x+Ionic3踩坑之Ionic 3.x界面传值详解
2018/03/13 Javascript
详解JavaScript中的函数、对象
2019/04/01 Javascript
Django+Vue实现WebSocket连接的示例代码
2019/05/28 Javascript
微信小程序复选框实现多选一功能过程解析
2020/02/14 Javascript
el-table表头根据内容自适应完美解决表头错位和固定列错位
2021/01/07 Javascript
[56:00]2018DOTA2亚洲邀请赛 4.6 淘汰赛 VP vs TNC 第二场
2018/04/10 DOTA
Python实现telnet服务器的方法
2015/07/10 Python
python虚拟环境virtualenv的使用教程
2017/10/20 Python
python3+PyQt5实现自定义分数滑块部件
2018/04/24 Python
浅谈Python 多进程默认不能共享全局变量的问题
2019/01/11 Python
python中aioysql(异步操作MySQL)的方法
2019/04/11 Python
python3通过selenium爬虫获取到dj商品的实例代码
2019/04/25 Python
Python redis操作实例分析【连接、管道、发布和订阅等】
2019/05/16 Python
python 从list中随机取值的方法
2020/11/16 Python
如何将Pycharm中调整字体大小的方式设置为"ctrl+鼠标滚轮上下滑"
2020/11/17 Python
澳大利亚冒险体验:Adrenaline(跳伞、V8赛车、热气球等)
2017/09/18 全球购物
DJI美国:消费类无人机领域的领导者
2018/04/27 全球购物
国际贸易毕业生求职信范文
2014/02/21 职场文书
2014年两会学习心得体会
2014/03/17 职场文书
Go语言实现Snowflake雪花算法
2021/06/08 Golang
基于PostgreSQL/openGauss 的分布式数据库解决方案
2021/12/06 PostgreSQL
电脑关机速度很慢怎么办 提升电脑关机速度设置教程
2022/04/08 数码科技
Java 多线程协作作业之信号同步
2022/05/11 Java/Android