【DRF分页】
我们数据库有几千万条数据,这些数据需要展示,我们不可能直接从数据库把数据全部读取出来.
因为这样会给内存造成巨大的压力,很容易就会内存溢出,所以我们希望一点一点的取.
同样,展示的时候也是一样的,我们必定会对数据进行分页显示.
本文将详细讲述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分页】的更多相关文章
- python 全栈开发,Day99(作业讲解,DRF版本,DRF分页,DRF序列化进阶)
昨日内容回顾 1. 为什么要做前后端分离? - 前后端交给不同的人来编写,职责划分明确. - API (IOS,安卓,PC,微信小程序...) - vue.js等框架编写前端时,会比之前写jQuery ...
- drf 分页,获取fk,choise,m2m等字段数据(序列化)
1.什么是restful规范 是一套规则,用于程序之间进行数据交换的约定. 他规定了一些协议,对我们感受最直接的的是,以前写增删改查需要写4个接口,restful规范的就是1个接口,根据method的 ...
- Django DRF 分页
Django DRF 分页 分页在DRF当中可以一共有三种,可以通过setttings设置,也可也通过自定义设置 PageNumberPagination 使用URL http://127.0.0.1 ...
- DRF 分页组件
Django Rest Framework 分页组件 DRF的分页 为什么要使用分页 其实这个不说大家都知道,大家写项目的时候也是一定会用的, 我们数据库有几千万条数据,这些数据需要展示,我们不可能直 ...
- DRF分页组件
为什么要使用分页 其实这个不说大家都知道,大家写项目的时候也是一定会用的, 我们数据库有几千万条数据,这些数据需要展示,我们不可能直接从数据库把数据全部读取出来, 这样会给内存造成特别大的压力,有可能 ...
- drf分页组件补充
drf偏移分页组件 pahenations.py from rest_framework.pagination import LimitOffsetPagination class MyLimitOf ...
- drf分页功能
什么是restful规范 是一套规则,用于程序之间进行数据交换的约定. 他规定了一些协议,对我们感受最直接的的是,以前写增删改查需要写4个接口,restful规范的就是1 个接口,根据method的不 ...
- drf 分页
分页: 1.简单的分页: 每页显示条数: page_size = api_settings.PAGE_SIZE 查询的页码数: page_query_param = "page" ...
- DRF分页
一.序列化 from rest_framework impost serializers from . models import * class GoodsSerializer(serializer ...
随机推荐
- Linux企业运维人员最常用150个命令汇
近来老男孩发现新手学习Linux记不住命令,不会分类.不会筛选重点,胡子眉毛一把抓当然记不住了. 特别整理Linux运维最常用150个命令和大家分享,大家学习命令不用在盲目了,根据分类,然后逐步学习! ...
- 在Ubuntu上创建一个可以启动的U盘
1.概观 使用可启动的Ubuntu USB盘,您可以: 安装或升级Ubuntu 在不触及PC配置的情况下测试Ubuntu桌面体验 在借来的机器或网吧上启动到Ubuntu 使用USB盘上默认安装的工具来 ...
- PHP DES-ECB加密对接Java解密
最近公司有个业务,需要对接第三方接口,但是参数是需要加密的,对方也只提供了一个java的demo,在网上到处搜索,没有找到直接就能用的方法,后来还是跟公司的Android工程师对接出来的,在这里记录一 ...
- 用Python讲述冯绍峰和赵丽颖的爱情故事
昨天刷头条时得知赵丽颖当妈妈了.作为一名程序员突发奇想,不如用Python简单叙述一下冯绍峰和赵丽颖的爱情故事,于是有了本文. 代码十分简单,适合编程小白和有一些Python基础的准程序员,其中用到了 ...
- 用JS中的cookie实现商品的浏览记录
最近在做一个购物车效果,为了实现商品的浏览记录效果可是让我百般周折,避免以后忘记特写此随笔与大家共享,希望博友们看后有所收获. 第一步:在一个公用的js文件下getCookie(“liulan”),c ...
- div和css:行内元素和块元素的水平和垂直居中
行内元素: 水平居中:text-align:center ul水平居中:加 display:table; margin:0 auto; 此元素会作为块级表格来显示(类似 <table>), ...
- 【ICM Technex 2018 and Codeforces Round #463 (Div. 1 + Div. 2, combined) B】Recursive Queries
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 写个记忆化搜索. 接近O(n)的复杂度吧 [代码] #include <bits/stdc++.h> using nam ...
- CSU 1506 Double Shortest Paths
1506: Double Shortest Paths Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 49 Solved: 5 Description ...
- PipeCAD之管道标准库PipeStd(2)
PipeCAD之管道标准库PipeStd(2) eryar@163.com Key Words. PipeCAD, PipeStd, 管道设计软件,管件库 1. Introduction 管道标准部件 ...
- spring 中国下载点
http://repo.spring.io/libs-release-local/org/springframework/spring/ spring 中国下载点


