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自动安装pip
Apr 24 Python
python在linux中输出带颜色的文字的方法
Jun 19 Python
Python中使用插入排序算法的简单分析与代码示例
May 04 Python
win10系统中安装scrapy-1.1
Jul 03 Python
pandas 按照特定顺序输出的实现代码
Jul 10 Python
Centos下实现安装Python3.6和Python2共存
Aug 15 Python
详解Python解决抓取内容乱码问题(decode和encode解码)
Mar 29 Python
python日志模块logbook使用方法
Sep 19 Python
python itsdangerous模块的具体使用方法
Feb 17 Python
Python反爬虫伪装浏览器进行爬虫
Feb 28 Python
使用python无账号无限制获取企查查信息的实例代码
Apr 17 Python
python之基数排序的实现
Jul 26 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
服务器端解压缩zip的脚本
2006/12/22 PHP
PHP实现采集程序原理和简单示例代码
2007/03/18 PHP
PHP 删除一个目录及目录下的所有文件的函数代码
2010/05/26 PHP
写一段简单的PHP建立文件夹代码
2015/01/06 PHP
PHP查看SSL证书信息的方法
2016/09/22 PHP
图片自动更新(说明)
2006/10/02 Javascript
JS 获取滚动条高度示例代码
2013/10/24 Javascript
JS中操作JSON总结
2020/12/06 Javascript
javascript中的throttle和debounce浅析
2014/06/06 Javascript
window.onload使用指南
2015/09/13 Javascript
JavaScript的String字符串对象常用操作总结
2016/05/26 Javascript
AngularJS实现标签页的两种方式
2016/09/05 Javascript
Nodejs实现短信验证码功能
2017/02/09 NodeJs
angularjs封装$http为factory的方法
2017/05/18 Javascript
基于Vue.js 2.0实现百度搜索框效果
2020/12/28 Javascript
js + css实现标签内容切换功能(实例讲解)
2017/10/09 Javascript
layui select动态添加option的实例
2018/03/07 Javascript
在vscode里使用.vue代码模板的方法
2018/04/28 Javascript
初学vue出现空格警告的原因及其解决方案
2019/10/31 Javascript
解决iview table组件里的 固定列 表格不自适应的问题
2020/11/13 Javascript
JavaScript实现表单验证功能
2020/12/09 Javascript
基于python的汉字转GBK码实现代码
2012/02/19 Python
python实现上传样本到virustotal并查询扫描信息的方法
2014/10/05 Python
Python Requests 基础入门
2016/04/07 Python
在Python的Flask中使用WTForms表单框架的基础教程
2016/06/07 Python
Python读取指定目录下指定后缀文件并保存为docx
2017/04/23 Python
对python 合并 累加两个dict的实例详解
2019/01/21 Python
python3通过selenium爬虫获取到dj商品的实例代码
2019/04/25 Python
python数据处理之如何选取csv文件中某几行的数据
2019/09/02 Python
python3代码输出嵌套式对象实例详解
2020/12/03 Python
使用phonegap获取设备的一些信息方法
2017/03/31 HTML / CSS
调任通知
2015/04/21 职场文书
我的法兰西岁月观后感
2015/06/09 职场文书
演讲稿:态度决定一切
2019/04/02 职场文书
使用javascript解析二维码的三种方式
2021/11/11 Javascript
面试中老生常谈的MySQL问答集锦夯实基础
2022/03/13 MySQL