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获取电脑硬件信息及状态的实现方法
Aug 29 Python
对比Python中__getattr__和 __getattribute__获取属性的用法
Jun 21 Python
Python第三方库xlrd/xlwt的安装与读写Excel表格
Jan 21 Python
连接pandas以及数组转pandas的方法
Jun 28 Python
Django 静态文件配置过程详解
Jul 23 Python
matplotlib命令与格式之tick坐标轴日期格式(设置日期主副刻度)
Aug 06 Python
解决Django 在ForeignKey中出现 non-nullable field错误的问题
Aug 06 Python
python多线程同步实例教程
Aug 11 Python
django drf框架中的user验证以及JWT拓展的介绍
Aug 12 Python
python多进程重复加载的解决方式
Dec 13 Python
Pandas时间序列基础详解(转换,索引,切片)
Feb 26 Python
python爬虫泛滥的解决方法详解
Nov 25 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/10/27 PHP
PHP封装类似thinkphp连贯操作数据库Db类与简单应用示例
2019/05/08 PHP
Laravel 将数据表的数据导出,并生成seeds种子文件的方法
2019/10/09 PHP
jQuery 改变CSS样式基础代码
2010/02/11 Javascript
关闭ie窗口清除Session的解决方法
2014/01/10 Javascript
javascript中interval与setTimeOut的区别示例介绍
2014/03/14 Javascript
javascript学习笔记--数字格式类型
2014/05/22 Javascript
jQuery使用元素属性attr赋值详解
2015/02/27 Javascript
Shell脚本实现Linux系统和进程资源监控
2015/03/05 Javascript
javascript 闭包详解
2015/07/02 Javascript
jQuery中DOM节点删除之empty与remove
2017/01/20 Javascript
浅谈Angular 的变化检测的方法
2018/03/01 Javascript
使用vue-cli导入Element UI组件的方法
2018/05/16 Javascript
Vue props用法详解(小结)
2018/07/03 Javascript
socket io与vue-cli的结合使用的示例代码
2018/11/01 Javascript
JavaScript简单实现的仿微博留言功能示例
2019/01/17 Javascript
js变量声明var使用与不使用的区别详解
2019/01/21 Javascript
少女风vue组件库的制作全过程
2019/05/15 Javascript
vue-列表下详情的展开与折叠案例
2020/07/28 Javascript
Python多线程实例教程
2014/09/06 Python
Python实现程序的单一实例用法分析
2015/06/03 Python
python+selenium 点击单选框-radio的实现方法
2019/09/03 Python
Python连接SQLite数据库并进行增册改查操作方法详解
2020/02/18 Python
Django实现将一个字典传到前端显示出来
2020/04/03 Python
keras中epoch,batch,loss,val_loss用法说明
2020/07/02 Python
Python SMTP发送电子邮件的示例
2020/09/23 Python
浅析Python中字符串的intern机制
2020/10/03 Python
python 实现网易邮箱邮件阅读和删除的辅助小脚本
2021/03/01 Python
英国手工布艺沙发在线购买:Sofas & Stuff
2018/03/02 全球购物
Annoushka英国官网:英国奢侈珠宝品牌
2018/10/20 全球购物
留学生如何写好自荐信
2013/12/27 职场文书
信息总监管理职责范本
2014/03/08 职场文书
卫生巾广告词
2014/03/18 职场文书
2014法制宣传日活动总结范文
2014/11/01 职场文书
新手入门Mysql--sql执行过程
2021/06/20 MySQL
HTML基础详解(上)
2021/10/16 HTML / CSS