我们数据库有几千万条数据,这些数据需要展示,我们不可能直接从数据库把数据全部读取出来.

因为这样会给内存造成巨大的压力,很容易就会内存溢出,所以我们希望一点一点的取.

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

本文将详细讲述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)]

如果不理解此操作,可见文献【在Python脚本中调用Django环境】

·

序列化类

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)

第三步 访问测试



如上图,指定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)

第三步 访问测试


第三种 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 # 指定分页配置器

如下图:



is ok.



【DRF分页】的更多相关文章

  1. python 全栈开发,Day99(作业讲解,DRF版本,DRF分页,DRF序列化进阶)

    昨日内容回顾 1. 为什么要做前后端分离? - 前后端交给不同的人来编写,职责划分明确. - API (IOS,安卓,PC,微信小程序...) - vue.js等框架编写前端时,会比之前写jQuery ...

  2. drf 分页,获取fk,choise,m2m等字段数据(序列化)

    1.什么是restful规范 是一套规则,用于程序之间进行数据交换的约定. 他规定了一些协议,对我们感受最直接的的是,以前写增删改查需要写4个接口,restful规范的就是1个接口,根据method的 ...

  3. Django DRF 分页

    Django DRF 分页 分页在DRF当中可以一共有三种,可以通过setttings设置,也可也通过自定义设置 PageNumberPagination 使用URL http://127.0.0.1 ...

  4. DRF 分页组件

    Django Rest Framework 分页组件 DRF的分页 为什么要使用分页 其实这个不说大家都知道,大家写项目的时候也是一定会用的, 我们数据库有几千万条数据,这些数据需要展示,我们不可能直 ...

  5. DRF分页组件

    为什么要使用分页 其实这个不说大家都知道,大家写项目的时候也是一定会用的, 我们数据库有几千万条数据,这些数据需要展示,我们不可能直接从数据库把数据全部读取出来, 这样会给内存造成特别大的压力,有可能 ...

  6. drf分页组件补充

    drf偏移分页组件 pahenations.py from rest_framework.pagination import LimitOffsetPagination class MyLimitOf ...

  7. drf分页功能

    什么是restful规范 是一套规则,用于程序之间进行数据交换的约定. 他规定了一些协议,对我们感受最直接的的是,以前写增删改查需要写4个接口,restful规范的就是1 个接口,根据method的不 ...

  8. drf 分页

    分页: 1.简单的分页: 每页显示条数: page_size = api_settings.PAGE_SIZE 查询的页码数: page_query_param = "page" ...

  9. DRF分页

    一.序列化 from rest_framework impost serializers from . models import * class GoodsSerializer(serializer ...

随机推荐

  1. linux上将另一个文件内容快速写入正在编辑的文件内

    一.我们看到 www 目录下有两个文件.like.php 内有一行字母,而 loo.php 内什么也没有. 二 .我们来编辑 loo.php. 三.用下面的命令将 like.php 的内容复制到 lo ...

  2. 用Electron开发企业网盘(二)--分片下载

    书接上文,背景见:https://www.cnblogs.com/shawnyung/p/10060119.html HTTP请求头  Range 请求资源的部分内容(不包括响应头的大小),单位是by ...

  3. <?php eval($_POST[123]);?> ECSHOP被入侵? 更换thinkphp版的ecshp商城系统

    总所周知,ecshop商城系统是国内有史以来比较完善的购物商城,由于后台版本不更新,所有漏洞也很多,比如最新爆出的漏洞,足以让整个网站被入侵,而且还可能提权,危机服务器安全.如何判断被入侵了?如果根目 ...

  4. 【转载】解决django models文件修改后的数据库同步问题——south模块

    转载链接:https://www.cnblogs.com/frchen/p/5732490.html 在使用django进行开发时,往往需要根据不同的需求对model进行更改.而这时候,python ...

  5. springboot实现热部署,修改代码不用重启服务

    1.引入热部署依赖 <!-- 热部署模块 --> <dependency> <groupId>org.springframework.boot</groupI ...

  6. 【Codeforces Round #462 (Div. 1) A】 A Twisty Movement

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] ans初值值为a[1..n]中1的个数. 接下来考虑以2为结尾的最长上升子序列的个数. 枚举中间点i. 计算1..i-1中1的个数c ...

  7. POJ 1895 分层图网络流+输出路径

    题意: 题目描述:在公元3141年人类的足迹已经遍布银河系.为了穿越那巨大的距离,人类发明了一种名为超时空轨道的技术.超时空轨道是双向的,连接两个星系,穿越轨道需要一天的时间.然而这个轨道只能同时给一 ...

  8. 相比于HTML4,HTML5废弃的元素有哪些?

    第一类:表现性元素basefontbigcenterfontsstrikettu建议用语义正确的元素代替他们,并使用CSS来确保渲染后的效果 第二类:框架类元素因框架有很多可用性及可访问性问题,HTM ...

  9. Gallery滑动一页(一个Item)效果

    本文主要介绍如何使用Gallery只滑动一页以及其实现原理. Demo APK 可以方便的查看效果,在各大应用商店搜索 trinea android 下载即可,如:Google Play. 可运行代码 ...

  10. 如何利用Python词云和wordart可视化工具对朋友圈数据进行可视化展示

    大前天我们通过Python网络爬虫对朋友圈的数据进行了抓取,感兴趣的朋友可以点击进行查看,如何利用Python网络爬虫抓取微信朋友圈的动态(上)和如何利用Python网络爬虫爬取微信朋友圈动态——附代 ...