侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

Django Rest framework三种分页方式详解

框架(架构)  /  管理员 发布于 7年前   280

前言

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

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

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

全局配置

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

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

from django.db import modelsclass Test(models.Model):  """用于测试分页的数据表"""  name = models.CharField(max_length=64)

生成表记录:

# 在Python脚本中调用Django环境import osif __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 ModelSerializerfrom blog.models import Test # 导入数据表class TestSerializer(ModelSerializer):  """用于测试分页的序列化类"""  class Meta:    model = Test    fields = '__all__'

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

第一步 分页器配置文件

from rest_framework import paginationclass 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 Responsefrom rest_framework.views import APIViewfrom rest_framework.serializers import ModelSerializerfrom 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)

第三步 访问测试


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

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

第一步 分页器配置文件

from rest_framework import paginationclass 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 Responsefrom rest_framework.views import APIViewfrom rest_framework.serializers import ModelSerializerfrom 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)

第三步 访问测试

***

第三种 CursorPagination 加密游标的分页

第一步 分页器配置文件

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

第二步 视图文件

from rest_framework.response import Responsefrom rest_framework.views import APIViewfrom rest_framework.serializers import ModelSerializerfrom 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 ModelViewSetclass Test04View(ModelViewSet):  queryset = Test.objects.all()  serializer_class = TestSerializer  pagination_class = CursorPagination # 指定分页配置器

如下图:


is ok.

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


  • 上一条:
    Django在pycharm下修改默认启动端口的方法
    下一条:
    Django REST framework内置路由用法
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • Filament v3.1版本发布(0个评论)
    • docker + gitea搭建一个git服务器流程步骤(0个评论)
    • websocket的三种架构方式使用优缺点浅析(0个评论)
    • ubuntu20.4系统中宿主机安装nginx服务,docker容器中安装php8.2实现运行laravel10框架网站(0个评论)
    • phpstudy_pro(小皮面板)中安装最新php8.2.9版本流程步骤(0个评论)
    • 近期文章
    • 在go中实现一个常用的先进先出的缓存淘汰算法示例代码(0个评论)
    • 在go+gin中使用"github.com/skip2/go-qrcode"实现url转二维码功能(0个评论)
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 欧盟关于强迫劳动的规定的官方举报渠道及官方举报网站(0个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf文件功能(0个评论)
    • Laravel从Accel获得5700万美元A轮融资(0个评论)
    • 在go + gin中gorm实现指定搜索/区间搜索分页列表功能接口实例(0个评论)
    • 在go语言中实现IP/CIDR的ip和netmask互转及IP段形式互转及ip是否存在IP/CIDR(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2018-05
    • 2020-02
    • 2020-03
    • 2020-05
    • 2020-06
    • 2020-07
    • 2020-08
    • 2020-11
    • 2021-03
    • 2021-09
    • 2021-10
    • 2021-11
    • 2022-01
    • 2022-02
    • 2022-03
    • 2022-08
    • 2023-08
    • 2023-10
    • 2023-12
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客