一、实例

分页有三种方式

  • 普通分页,看第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 之 分页的更多相关文章

  1. django rest framework实现分页功能

    在web开发中很多需求都需要实现分页功能,然而 Django Rest Framework 自带的分页功能,只能在 mixins.ListModelMixin and generics.Generic ...

  2. Django REST framework的分页

    DRF分页组件 为什么要使用分页 我们数据表中可能会有成千上万条数据,当我们访问某张表的所有数据时,我们不太可能需要一次把所有的数据都展示出来,因为数据量很大,对服务端的内存压力比较大还有就是网络传输 ...

  3. Django REST framework 之分页,视图,路由,渲染器

    1.分页 2.视图 3.路由 4.渲染器 1.分页 方法一: from django.shortcuts import render from rest_framework.versioning im ...

  4. Django rest framework 之分页

    Django rest_framework 中分页可分为三类: PageNumberPagination:看第 n 页,每页显示 n 条数据 LimitOffsetPagination:在 n 个位置 ...

  5. Django Rest framework 之 序列化

    RESTful 规范 django rest framework 之 认证(一) django rest framework 之 权限(二) django rest framework 之 节流(三) ...

  6. Django Rest framework 之 解析器

    RESTful 规范 django rest framework 之 认证(一) django rest framework 之 权限(二) django rest framework 之 节流(三) ...

  7. Django Rest framework 之 版本

    RESTful 规范 django rest framework 之 认证(一) django rest framework 之 权限(二) django rest framework 之 节流(三) ...

  8. Django Rest framework 之 节流

    RESTful 规范 django rest framework 之 认证(一) django rest framework 之 权限(二) django rest framework 之 节流(三) ...

  9. Django Rest framework 之 权限

    django rest framework 之 认证(一) django rest framework 之 权限(二) django rest framework 之 节流(三) django res ...

随机推荐

  1. BigDecimalUtils

    package com.sprucetec.tms.utils; import java.math.BigDecimal;import java.text.SimpleDateFormat;impor ...

  2. 让PETSc跑得再快一些

    最近做了一个使用PETSc来求解线性方程组(Ax=b)的项目,把其中遇到的一些坑和解决方法记录下来.本文不介绍PETSc如何入门,而是给出一些能让PETSc运行得更快的编程细节.开始我只是简单地修改P ...

  3. [转载]windows下安装Python虚拟环境virtualenv,virtualenvwrapper-win

    1 前言 由于Python的版本众多,还有Python2和Python3的争论,因此有些软件包或第三方库就容易出现版本不兼容的问题. 通过 virtualenv 这个工具,就可以构建一系列 虚拟的Py ...

  4. (转)学会数据库读写分离、分表分库——用Mycat,这一篇就够了!

    原文:https://www.cnblogs.com/joylee/p/7513038.html 系统开发中,数据库是非常重要的一个点.除了程序的本身的优化,如:SQL语句优化.代码优化,数据库的处理 ...

  5. Hadoop环境搭建及wordcount程序

    目的: 前期学习了一些机器学习基本算法,实际企业应用中算法是核心,运行的环境和数据处理的平台是基础. 手段: 搭建简易hadoop集群(由于机器限制在自己的笔记本上通过虚拟机搭建) 一.基础环境介绍 ...

  6. 全网最详细的Windows系统里Oracle 11g R2 Client客户端(64bit)安装后的初步使用(图文详解)

    不多说,直接上干货! 前期博客 全网最详细的Windows系统里Oracle 11g R2 Client(64bit)的下载与安装(图文详解) 命令行方式测试安装是否成功 1)   打开服务(cmd— ...

  7. Normal Map中的值, Tangent Space, 求算 Tangent 与 Binormal 与 TBN Matrix

      - Normal Map中的值 -   有没有想过,Normal Map(法线贴图)为什么看上去都是“偏蓝色”的?这是因为,在map中存储的值都是在Tangent Space(切空间)下的.比如, ...

  8. 浅谈 Unix I/O 模型

    原文出处:http://miaoo.in/talk-about-unix-io-model.html 在实际应用中,数据操作通常分为输入和输出,那么以输入为例,在操作系统中,一个数据的输入通常分为以下 ...

  9. 大佬带你深入浅出Lua虚拟机

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由鹅厂优文发表于云+社区专栏 作者:郑小辉 | 腾讯 游戏客户端开发高级工程师 写在前面:本文所有的文字都是我手工一个一个敲的,以及本文 ...

  10. quartz ? * 区别

    官方文档上提到问号时是这样说的: The '?' character is allowed for the day-of-month and day-of-week fields. It is use ...