Django rest_framework 中分页可分为三类:

  • PageNumberPagination:看第 n 页,每页显示 n 条数据
  • LimitOffsetPagination:在 n 个位置,向后查看 n 条数据
  • CursorPagination:加密分页,只能看上一页和下一页

一、PageNumberPagination

在这里将采用 rest_framework 内置的页面渲染器 Response

1、api/serializers.py

class PagesSerializers(serializers.ModelSerializer):
"""分页""" class Meta:
model = models.Role
fields = '__all__'

2、api/views.py

from rest_framework.response import Response    # 渲染器
from .serializers import PagesSerializers from app import models
from rest_framework.pagination import PageNumberPagination class PageView(APIView):
"""分页"""
def get(self, request, *args, **kwargs):
"""示例:
http://api.example.org/accounts/?page=4
http://api.example.org/accounts/?page=4&page_size=100
"""
roles = models.Role.objects.all()
# 创建分页对象
pg = PageNumberPagination()
# 获取分页数据
page_roles = pg.paginate_queryset(queryset=roles, request=request, view=self)
# 将分页后的数据序列化
roles_ser = PagesSerializers(instance=page_roles, many=True) # 将序列化后的数据渲染到前端显示,这里采用的是 rest_framework 的渲染器 Response
return Response(roles_ser.data)

3、api/urls.py

from django.urls import path, re_path
from api.views import UserView, ParserView, RolesView, UserInfoView, GroupView, UserGroupView, PageView urlpatterns = [ re_path('(?P<version>[v1|v2]+)/pages/', PageView.as_view()), # 分页 ]

4、另外需要配置每页显示的条数 settings.py

REST_FRAMEWORK = {
"DEFAULT_VERSION": 'v1', # 默认的版本
"ALLOWED_VERSIONS": ['v1', 'v2'], # 允许的版本
"VERSION_PARAM": 'version', # GET方式url中参数的名字 ?version=xxx
"PAGE_SIZE": 2, # 每页最多显示两条数据
}

5、访问(第二页数据):http://127.0.0.1:8000/api/v2/pages/?page=2

自定义分页

定义一个类,让它继承 PageNumberPagination

1、api/views.py

class MyPageNumberPagination(PageNumberPagination):
"""自定义分页类"""
page_size = 2 # 每页最多显示的条数
page_query_param = 'page' # 查询参数,URL 中的过滤参数 # 通过 page_size 每页只显示 2 条,使用下面这个参数可以改变默认显示条数
# 使用方法 http://127.0.0.1:8000/api/v2/pages/?page=2&size=3
page_size_query_param = 'size'
max_page_size = 10 # 最大页数 class PageView(APIView):
"""分页"""
def get(self, request, *args, **kwargs):
"""
http://api.example.org/accounts/?page=4
http://api.example.org/accounts/?page=4&page_size=100
"""
roles = models.Role.objects.all()
# 创建分页对象
# pg = PageNumberPagination()
pg = MyPageNumberPagination()
# 获取分页数据
page_roles = pg.paginate_queryset(queryset=roles, request=request, view=self)
# 将分页后的数据序列化
roles_ser = PagesSerializers(instance=page_roles, many=True) # 将序列化后的数据渲染到前端显示,这里采用的是 rest_framework 的渲染器 Response
return Response(roles_ser.data)

2、访问:http://127.0.0.1:8000/api/v2/pages/?page=2&size=1

二、LimitOffsetPagination

LimitOffsetPagination 可以控制只查看多少条,以及偏移量 offset 后多少条数据,格式为:

http://api.example.org/accounts/?limit=100      # 控制查看 100 条数据
http://api.example.org/accounts/?offset=400&limit=100 # 偏移量 400,查看条数 100,即查看 400 后的 100 条数据

使用方法与 PageNumberPagination 一致:

from rest_framework.pagination import PageNumberPagination, LimitOffsetPagination

class PageView(APIView):
"""分页"""
def get(self, request, *args, **kwargs):
"""
http://api.example.org/accounts/?page=4
http://api.example.org/accounts/?page=4&page_size=100
"""
roles = models.Role.objects.all()
# 创建分页对象
# pg = PageNumberPagination()
# pg = MyPageNumberPagination()
pg = LimitOffsetPagination()
# 获取分页数据
page_roles = pg.paginate_queryset(queryset=roles, request=request, view=self)
# 将分页后的数据序列化
roles_ser = PagesSerializers(instance=page_roles, many=True) # 将序列化后的数据渲染到前端显示,这里采用的是 rest_framework 的渲染器 Response
return Response(roles_ser.data)

查看第 2 条数据后的 3 条数据:

自定义

同样地 LimitOffsetPagination 也支持自定义:

#自定义分页类2
class MyLimitOffsetPagination(LimitOffsetPagination):
#默认显示的个数
default_limit = 2
#当前的位置
offset_query_param = "offset"
#通过limit改变默认显示的个数
limit_query_param = "limit"
#一页最多显示的个数
max_limit = 10

get_paginated_response() 方法控制前后页面

api/views.py

class PageView(APIView):
"""分页"""
def get(self, request, *args, **kwargs):
"""
http://api.example.org/accounts/?page=4
http://api.example.org/accounts/?page=4&page_size=100
"""
roles = models.Role.objects.all()
# 创建分页对象
# pg = PageNumberPagination()
# pg = MyPageNumberPagination()
pg = LimitOffsetPagination()
# 获取分页数据
page_roles = pg.paginate_queryset(queryset=roles, request=request, view=self)
# 将分页后的数据序列化
roles_ser = PagesSerializers(instance=page_roles, many=True) # 将序列化后的数据渲染到前端显示,这里采用的是 rest_framework 的渲染器 Response
# return Response(roles_ser.data)
return pg.get_paginated_response(roles_ser.data) # 这一行

效果如下:

三、CursorPagination

CursorPagination 将页码进行加密,使得不能通过 URL 来控制显示的页面

1、这里使用自定义分页类 api/views.py

class MyCursorPagination(CursorPagination):
"""自定义分页类"""
page_size = 2 # 每页最多显示的条数
cursor_query_param = 'cursor' # 查询参数,URL 中的过滤参数 ordering = 'id' # 通过什么排序(正序)
page_size_query_param = None
max_page_size = None # 最大页数 class PageView(APIView):
"""分页"""
def get(self, request, *args, **kwargs):
"""
http://api.example.org/accounts/?page=4
http://api.example.org/accounts/?page=4&page_size=100
"""
roles = models.Role.objects.all()
# 创建分页对象
# pg = PageNumberPagination()
# pg = MyPageNumberPagination()
# pg = LimitOffsetPagination()
pg = MyCursorPagination()
# 获取分页数据
page_roles = pg.paginate_queryset(queryset=roles, request=request, view=self)
# 将分页后的数据序列化
roles_ser = PagesSerializers(instance=page_roles, many=True) # 将序列化后的数据渲染到前端显示,这里采用的是 rest_framework 的渲染器 Response
# return Response(roles_ser.data)
return pg.get_paginated_response(roles_ser.data)

2、访问: http://127.0.0.1:8000/api/v2/pages/

Django rest framework 之分页的更多相关文章

  1. Django Rest framework 之 分页

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

  2. django rest framework实现分页功能

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

  3. Django REST framework的分页

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

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

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

  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. django -- 安装django

    安装 通过cmd进行安装 pip3 install django==1.11.11 创建django项目 通过命令行进行创建 下面的命令创建了一个名为"mydjango"的Djan ...

  2. 【JZOJ6236】【20190628】启程的日子

    题目 给你一个\(n \times m\)的01矩阵 你需要用一些矩阵加减出这个矩阵 求最少的步数,并输出方案 需要满足构造出的01矩阵是一个四联通块 $ n ,  m \le 500 $ 题解 答案 ...

  3. ZROI 暑期高端峰会 A班 Day3 图论

    最短路 NOI2019 D2T1 弹跳 KD 树 线段树套set -> 线段树套并查集? POI2014/2015 ??? \(n\) 个点 \(m\) 条边 DAG.求删掉每个点后 \(1\) ...

  4. 洛谷P3084 [USACO13OPEN]照片

    题目 \(DP\) 设状态\(dp[i]\)为\(i\)位置放了斑点牛,前\(i\)个位置能得到的最多的牛. 有方程\(dp[i]=max(dp[j]+1,dp[i])\),而我们并不知道什么\(j\ ...

  5. PyTorch学习之六个学习率调整策略

    PyTorch学习率调整策略通过torch.optim.lr_scheduler接口实现.PyTorch提供的学习率调整策略分为三大类,分别是 有序调整:等间隔调整(Step),按需调整学习率(Mul ...

  6. centos gcc编译

    centos上面的gcc是4.x的,因为我们使用了c++17,所以想升级成最新的gcc 1. 下载源码 https://gcc.gnu.org/index.html 2. 下载下来是.tar.xz,因 ...

  7. MongoDB Shell 命令

    更新列名 db.Stores.update({}, {$rename : {"StoreId" : "MetaId"}}, false, true) 查询长度 ...

  8. Rattle

    Rattle使用RGtk2 包提供的Gnome图形用户界面,可以在WINDOWS,MAC OS/X,Linux等多个系统中使用. Rattle基于大量的R包:RGtk2, pmml, colorspa ...

  9. 分布式系统中我们会对一些数据量大的业务进行分拆,分布式系统中唯一主键ID的生成问题

    分布式全局唯一ID生成策略​ https://www.cnblogs.com/vandusty/p/11462585.html 一.背景 分布式系统中我们会对一些数据量大的业务进行分拆,如:用户表,订 ...

  10. flume到flume消息传递

    环境:两台虚拟机( 每台都有flume) 第一台slave作为消息的产生者 第二台master作为消息的接收者    IP(192.168.83.133) 原理:通过监听slave中文件的变化,获取变 ...