Django Rest framework 之 分页
- RESTful 规范
- django rest framework 之 认证(一)
- django rest framework 之 权限(二)
- django rest framework 之 节流(三)
- django rest framework 之 版本(四)
- django rest framework 之 解析器(五)
- django rest framework 之 序列化(六)
- django rest framework 之 分页(七)
- django rest framework 之 视图(八)
一、实例
分页有三种方式
- 普通分页,看第n页,每页显示m条数据;
- 切割分页,在n个位置,向后查看m条数据;
- 加密分页,这与普通分页方式相似,不过对url中的请求页码进行加密。
1、路由
<1>、主路由
from django.urls import include
from django.conf.urls import url
urlpatterns = [
url(r'^api/', include('api.urls', namespace='api') ),
]
<2>、app路由
from django.urls import include
from django.conf.urls import url
urlpatterns = [
url(r'^page/$', PageView.as_view()),
]
2、视图
在不使用django rest framework中的分页组件仍能够达到目的
from rest_framework import serializers
from rest_framework.views import APIView
from rest_framework.response import Response
class PagerSerializer(serializers.ModelSerializer):
class Meta:
model = Role
fields = "__all__"
class PageView(APIView):
def get(self, request , *args, **kwargs):
roles = Role.objects.get_queryset().order_by('id')
roles_ser = PagerSerializer(instance=roles, many=True)
return Response(roles_ser.data) # 只返回数据
返回结果

二、使用普通分页
1、自定义分页类
from rest_framework.pagination import PageNumberPagination
class MyPageNumberPagination(PageNumberPagination):
page_size = 2
max_page_size = 5
page_size_query_param = 'size'
page_query_param = 'page'
- page_query_param:表示url中的页码参数
- page_size_query_param:表示url中每页数量参数
- page_size:表示每页的默认显示数量
- max_page_size:表示每页最大显示数量,做限制使用,避免突然大量的查询数据,数据库崩溃
2、视图
class PagerSerializer(serializers.ModelSerializer):
class Meta:
model = Role
fields = "__all__"
class PageView(APIView):
def get(self, request , *args, **kwargs):
roles = Role.objects.get_queryset().order_by('id')
page = MyPageNumberPagination()
page_roles = page.paginate_queryset(queryset=roles, request=request, view=self)
roles_ser = PagerSerializer(instance=page_roles, many=True)
# return Response(roles_ser.data) # 只返回数据
return page.get_paginated_response(roles_ser.data) # 返回前后夜url
- 首先需要实例化我们定义的分页类
- 并且对实例化类进行传参控制
- 最后将分页后的对象作序列化
3、测试结果
<1>、正常测试
http://127.0.0.1:8000/api/page/

<2>、page、size测试
http://127.0.0.1:8000/api/page/?page=2&size=3 表示第二页,每页显示三条数据

三、使用普通分页
1、自定义分页类
from rest_framework.pagination import LimitOffsetPagination
class MyLimitOffsetPagination(LimitOffsetPagination):
default_limit = 2
limit_query_param = 'limit'
offset_query_param = 'offset'
max_limit = 5
- default_limit:表示默认每页显示几条数据
- limit_query_param:表示url中本页需要显示数量参数
- offset_query_param:表示从数据库中的第几条数据开始显示参数
- max_limit:表示每页最大显示数量,做限制使用,避免突然大量的查询数据,数据库崩溃
2、视图
class PagerSerializer(serializers.ModelSerializer):
class Meta:
model = Role
fields = "__all__"
class PageView(APIView):
def get(self, request , *args, **kwargs):
roles = Role.objects.get_queryset().order_by('id')
page = MyLimitOffsetPagination()
page_roles = page.paginate_queryset(queryset=roles, request=request, view=self)
roles_ser = PagerSerializer(instance=page_roles, many=True)
# return Response(roles_ser.data) # 只返回数据
return page.get_paginated_response(roles_ser.data) # 返回前后夜url
- 首先需要实例化我们定义的分页类
- 并且对实例化类进行传参控制
- 最后将分页后的对象作序列化
3、测试结果
<1>、测试结果一
http://127.0.0.1:8000/api/page/?

<2>、测试结果二
http://127.0.0.1:8000/api/page/?offset=2&limit=3表示从数据库中的第二条数据开始查询三条数据

四、使用加密分页
使用加密分页的原因:如果使用普通分页时,由于向用户提供了可选参数page,用户可以直接跳到数据分页之后的任意页码。但是这样做的后果就是,数据库的负载变大,返回结果的效率缓慢。但是一旦使用加密之后,虽然提供可选参数cursor,但是对页码进行加密,用户无法知道当前页,而是以上一页下一页的方式翻阅数据。有效避免了数据库的负荷。但是就需要向用户提供上一页下一页的url。
1、自定义分页类
from rest_framework.pagination import LimitOffsetPagination
class MyCursorPagination(CursorPagination):
cursor_query_param = 'cursor'
page_size = 2
ordering = 'id'
page_size_query_param = 'size'
max_page_size = 5
- default_limit:表示默认每页显示几条数据
- cursor_query_param:表示url中页码的参数
- page_size_query_param:表示每页显示数据量的参数
- max_page_size:表示每页最大显示数量,做限制使用,避免突然大量的查询数据,数据库崩溃
- ordering:表示返回数据的排序方式
2、视图
class PagerSerializer(serializers.ModelSerializer):
class Meta:
model = Role
fields = "__all__"
class PageView(APIView):
def get(self, request , *args, **kwargs):
roles = Role.objects.get_queryset().order_by('id')
page = MyCursorPagination()
page_roles = page.paginate_queryset(queryset=roles, request=request, view=self)
roles_ser = PagerSerializer(instance=page_roles, many=True)
return page.get_paginated_response(roles_ser.data) # 返回前后夜url
- 首先需要实例化我们定义的分页类
- 并且对实例化类进行传参控制
- 最后将分页后的对象作序列化
- 由于要想用户提供可用的上下页接口,所以只能用
return page.get_paginated_response(roles_ser.data)做返回
3、测试结果
<1>、测试结果一
http://127.0.0.1:8000/api/page/?

<2>、测试结果二
http://127.0.0.1:8000/api/page/?cursor=cD0z&size=3这里直接点击下一页url并追加每页显示数据量参数size

五、总结
三种分页中,普通分页与django中的分页基本没有区别。不过要做分页返回给前端数据,就要从数据库中取出数据,然后在做分页序列化。如果用户一下在前几页请求数据库中的最后几页数据,对查询数据库的时延,对数据库的负载较大,就会出现问题,这个时候就可以使用加密分页,限制用户的访问,只提供前一页和后一页的接口。
Django Rest framework 之 分页的更多相关文章
- django rest framework实现分页功能
在web开发中很多需求都需要实现分页功能,然而 Django Rest Framework 自带的分页功能,只能在 mixins.ListModelMixin and generics.Generic ...
- Django REST framework的分页
DRF分页组件 为什么要使用分页 我们数据表中可能会有成千上万条数据,当我们访问某张表的所有数据时,我们不太可能需要一次把所有的数据都展示出来,因为数据量很大,对服务端的内存压力比较大还有就是网络传输 ...
- Django REST framework 之分页,视图,路由,渲染器
1.分页 2.视图 3.路由 4.渲染器 1.分页 方法一: from django.shortcuts import render from rest_framework.versioning im ...
- Django rest framework 之分页
Django rest_framework 中分页可分为三类: PageNumberPagination:看第 n 页,每页显示 n 条数据 LimitOffsetPagination:在 n 个位置 ...
- Django Rest framework 之 序列化
RESTful 规范 django rest framework 之 认证(一) django rest framework 之 权限(二) django rest framework 之 节流(三) ...
- Django Rest framework 之 解析器
RESTful 规范 django rest framework 之 认证(一) django rest framework 之 权限(二) django rest framework 之 节流(三) ...
- Django Rest framework 之 版本
RESTful 规范 django rest framework 之 认证(一) django rest framework 之 权限(二) django rest framework 之 节流(三) ...
- Django Rest framework 之 节流
RESTful 规范 django rest framework 之 认证(一) django rest framework 之 权限(二) django rest framework 之 节流(三) ...
- Django Rest framework 之 权限
django rest framework 之 认证(一) django rest framework 之 权限(二) django rest framework 之 节流(三) django res ...
随机推荐
- Java Listener中Spring接口注入的使用
在项目中使用Spring通常使用他的依赖注入可以很好的处理,接口与实现类之间的耦合性,但是通常的应用场景中都是Service层和DAO层,或者web层的话, 也是与Strust2来整合,那么如何在Li ...
- Android动画Animation简单示例
Animation是Android给我们提供的一个可以实现动画效果的API,利用Animation我们可以实现一系列的动画效果,比如缩放动画,透明度动画,旋转动画,位移动画,布局动画,帧动画等等.An ...
- [vuejs] vue2.0-layer-mobile移动端弹层
vue2.0-layer-mobile移动端弹层 本次组件升级支持slot内容分发功能,实现高定制内容风格的弹层 安装方法 npm install vue2-layer-mobile -S 初始化 i ...
- Data - Hadoop伪分布式配置 - 使用Hadoop2.8.0和Ubuntu16.04
系统版本 anliven@Ubuntu1604:~$ uname -a Linux Ubuntu1604 4.8.0-36-generic #36~16.04.1-Ubuntu SMP Sun Feb ...
- d3.js在vue项目中的安装及案例
1. 安装: npm i d3 --save 2. 引入:main.js import * as d3 from "d3"; Vue.prototype.$d3 = d3; win ...
- Storm中的定时任务
1.全局定时器 import java.util.Map; import backtype.storm.Config; import backtype.storm.Constants; import ...
- Window服务与Quartz.NET
Quartz.NET: http://quartznet.sourceforge.net/ (现为2.2版本) Sourceforge:http://sourceforge.net/projects/ ...
- Mysql大数据表优化处理
原文链接: https://segmentfault.com/a/1190000006158186 当MySQL单表记录数过大时,增删改查性能都会急剧下降,可以参考以下步骤来优化: 单表优化 除非单表 ...
- JSP -- 从甲骨文开始
1.Oracle10gForVistaX64下载地址:http://download.oracle.com/otn/nt/oracle10g/10204/10204_vista_w2k8_x64_pr ...
- [Python] 震惊, 我居然用Python干这种事ꈍ .̮ ꈍ
阅读本文只需花费你两分钟, 两分钟你买不了吃亏,你也买不了上当. 那么, 为何不静下心来看看呢? Python 海龟创意绘画, Turtle库创作精美图画 Author:Amd794 E-ma ...