分页

分页器的引入

from rest_framework.pagination import PageNumberPagination, LimitOffsetPagination, CursorPagination

分页器的创建

PageNumberPagination分页器

按页码数分页,第n页,每页显示m条数据

使用URL

http://127.0.0.1:8000/api/article/?page=2&size=1 

示例

# PageNumberPagination 方式 分页器
class MyPageNumberPagination(PageNumberPagination): # 创建一个自定义类继承分页器类,自定义类中进行参数设置,自定义类的实例化即为分页器对象
page_size = 1 # 每页显示数目
page_query_param = 'page' # url 中的指定 关键字
page_size_query_param = "size" # 允许临时添加的参数
max_page_size = 5 # 对临时添加数据的限制 """
关于临时添加参数
http://127.0.0.1:8000/?page=1&size=2
size 为临时添加数据 由 page_size_query_param 控制
max_page_size 控制 size 的限制
"""
class P2(PageNumberPagination):
#默认每页显示的数据条数
page_size = 2
#获取url参数中设置的每页显示数据条数
page_size_query_param = 'size'
#获取url中传入的页码key
page_query_param = 'page'
#最大支持的每页显示的数据条数
max_page_size = 5 class IndexView3(APIView):
#使用http://127.0.0.1:8080/app01/v1/index3/?page=1&page_size=1可进行判断
def get(self,request,*args,**kwargs):
user_list = models.UserInfo.objects.all()
#实例化分页对象,获取数据库中的分页数据
p2 = P2()
print(p2.page_size_query_description)
page_user_list = p2.paginate_queryset(queryset=user_list,request=request,view=self)
print('打印的是分页的数据',page_user_list) #序列化对象
ser = MySerializes(instance=page_user_list,many=True) #可允许多个 #生成分页和数据
# return Response(ser.data) #不含上一页下一页
return p2.get_paginated_response(ser.data)

LimitOffsetPagination分页器

分页,在n位置,向后查看m条数据

使用URL

http://127.0.0.1:8000/api/article/?offset=2&limit=2

示例


# LimitOffsetPagination 方式 分页器
class MyPageNumberPagination(LimitOffsetPagination):
default_limit=1 # 每页最多显示多少数目 关键词是 limit
"""
LimitOffsetPagination 的分页器 拥有一个 offset 内置 参数
http://127.0.0.1:8000/?limit=1&offset=2
offst 表示向后偏移,偏移块大小为 limit的长度
当前页1 limit=1 offset=2 表示向下偏移两个长度 显示第三页内容
"""
from rest_framework.views import APIView
from rest_framework.response import Response
from app01.serializes.myserializes import MySerializes
from rest_framework.pagination import LimitOffsetPagination
from app01 import models # =========== 可以自己进行自定制分页,基于limitoffset===================
class P1(LimitOffsetPagination):
max_limit = 3 # 最大限制默认是None
default_limit =2 # 设置每一页显示多少条
limit_query_param = 'limit' # 往后取几条
offset_query_param = 'offset' # 当前所在的位置 class IndexView2(APIView):
#使用http://127.0.0.1:8080/app01/v1/index2/?offset=2&limit=4可进行判断
def get(self,request,*args,**kwargs):
user_list = models.UserInfo.objects.all()
p1 = P1()#注册分页
page_user_list = p1.paginate_queryset(queryset=user_list,request=request,view=self)
print('打印的是分页的数据',page_user_list)
ser = MySerializes(instance=page_user_list,many=True) #可允许多个
# return Response(ser.data) #不含上一页下一页
return p1.get_paginated_response(ser.data) # =======================也可以用下面这种形式===========
class BaseResponse(object):
def __init__(self,code=1000,data=None,error=None):
self.code = code
self.data = data
self.error = error
class IndexView(views.APIView):
'''第二种类表示的方式'''
def get(self,request,*args,**kwargs):
ret = BaseResponse()
try:
user_list = models.UserInfo.objects.all()
p1 = P1()
page_user_list = p1.paginate_queryset(queryset=user_list,request=request,view=self)
ser = IndexSerializer(instance=page_user_list,many=True)
ret.data = ser.data
ret.next = p1.get_next_link()
except Exception as e:
ret.code= 1001
ret.error = 'xxxx错误'
return Response(ret.__dict__)

CursorPagination分页器

加密分页,把上一页和下一页的id值记住

使用URL

http://127.0.0.1:8000/api/article/?page=2&size=1 

示例

基本和 PageNumberPagination 内部字段差不多

class P3(CursorPagination):
# URL传入的游标参数
cursor_query_param = 'cursor'
# 默认每页显示的数据条数
page_size = 2
# URL传入的每页显示条数的参数
page_size_query_param = 'size'
# 每页显示数据最大条数
max_page_size = 3
# 根据ID从大到小排列
ordering = "id" class IndexView4(APIView):
#使用http://127.0.0.1:8080/app01/v1/index4/?cursor=cj0xJnA9NA%3D%3D&size=3可进行判断
def get(self,request,*args,**kwargs):
user_list = models.UserInfo.objects.all().order_by('-id')
p3 = P3()#注册分页
page_user_list = p3.paginate_queryset(queryset=user_list,request=request,view=self)
print('打印的是分页的数据',page_user_list)
ser = MySerializes(instance=page_user_list,many=True) #可允许多个
# return Response(ser.data) #不含上一页下一页
return p3.get_paginated_response(ser.data)

分页器的使用

# 分页器的使用一:未封装起来的时候
class BookViewSet(viewsets.ModelViewSet):
queryset = Book.objects.all()
serializer_class = BookSerializers
def list(self,request,*args,**kwargs):
book_list=Book.objects.all()
# 调用分页器类实例化 (根据分页器类型要做区分)
pp=LimitOffsetPagination()
# 对分页器对象赋值使用 实例化自定义分页类
# 参数 queryset=被分页的queryset对象,后两个固定即可
pager_books=pp.MyPageNumberPagination(queryset=book_list,request=request,view=self)
bs=BookSerializers(pager_books,many=True)
return pp.get_paginated_response(bs.data) # 分页器的使用二:封装起来的时候
class AuthorModelView(viewsets.ModelViewSet):
queryset = Author.objects.all()
serializer_class = AuthorModelSerializers # 序列化组件
pagination_class = MyPageNumberPagination # 分页组件,分页器只能使用一个,此处不可以为列表 # 分页器的使用三: 全局生效,在settings.py 中设置
REST_FRAMEWORK = {
'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.LimitOffsetPagination',
'PAGE_SIZE': 100
}

版本

为什么需要版本控制

API 版本控制允许我们在不同的客户端之间更改行为(同一个接口的不同版本会返回不同的数据)。 DRF提供了许多不同的版本控制方案。

可能会有一些客户端因为某些原因不再维护了,但是我们后端的接口还要不断的更新迭代,这个时候通过版本控制返回不同的内容就是一种不错的解决方案。

内置版本类型

DRF提供了五种版本控制方案

版本的创建使用

# 版本控制
# 1. 配置文件中加入
REST_FRAMEWORK = {
# 全局配置版本
# "DEFAULT_VERSIONING_CLASS": "rest_framework.versioning.QueryParameterVersioning",
# # 配置默认允许版本
# "ALLOWED_VERSIONS": ["v1", "v2"],
# # 配置默认版本
# "DEFAULT_VERSION": "v1",
# # 配置参数
# "VERSION_PARAM": "version", # 还是推荐用 URLPathVersioning 的方式来控制版本更好用一些
"DEFAULT_VERSIONING_CLASS": "rest_framework.versioning.URLPathVersioning",
}  
# 2. 设置路由
urlpatterns = [
url(r'^(?P<version>[v1|v2]+)/api/', include("api.urls")),
]
# 3 获取版本
request.version

ps:

  通常我们是不会单独给某个视图设置版本控制的,如果你确实需要给单独的视图设置版本控制,你可以在视图中设置versioning_class属性

class PublisherViewSet(ModelViewSet):

    ...
versioning_class = URLPathVersioning

  在视图中自定义具体的行为,不同的版本返回不同的序列化类

class PublisherViewSet(ModelViewSet):

    def get_serializer_class(self):
"""不同的版本使用不同的序列化类"""
if self.request.version == 'v1':
return PublisherModelSerializerVersion1
else:
return PublisherModelSerializer
queryset = models.Publisher.objects.all()

rest framework 分页,版本的更多相关文章

  1. .net Framework各个版本之间的发展

    原文:.net Framework各个版本之间的发展 上个星期看到了.NET 4.0框架退休日期逐渐临近文章,发现自己一直在使用NET  FrameWork,身为一个NET程序员,里面大概的区别自己还 ...

  2. Django Rest framework 之 版本

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

  3. .net FrameWork各个版本之间的发展[转]

    上个星期看到了.NET 4.0框架退休日期逐渐临近文章,发现自己一直在使用NET  FrameWork,身为一个NET程序员,里面大概的区别自己还是知道的,但是自己要说出个所以然来了,发现还是有点力不 ...

  4. .NET Framework各版本汇总以及之间的关系

    目录(?)[-] 原文链接:http://blog.csdn.net/kingmax54212008/article/details/25886345 NET Framework 版本关系 获取NET ...

  5. .NET Framework个版本说明

    .NET Framework .NET版本 1.0 1.1 2.0 3.0 3.5 4.0 4.5 完整版本 1.0.3705.0 1.1.4322.573 2.0.50727.42 3.0.4506 ...

  6. ASP.NET在IIS7中如何更改网站的.net framework框架版本

    IIS7安装好以后使用了.net 2.0 framework框架,经过折腾发现如下方法可以更改框架版本,从而可以部署使用其他版本框架开发的网站 方法一:建立网站时设置.net框架版本 方法二:对于已经 ...

  7. 简单概述 .NET Framework 各版本区别

    目前已发行的版本有1.0.1.1.2.0.3.0.3.5.4.0.4.5(及4.5.1.4.5.2).4.6(及4.6.1). 1.0版本:最初的.net framework版本,作为一个独立的工具包 ...

  8. .NET Framework 各版本区别

    .NET Framework 各版本区别 .NET Framework 1.1 自1.0版本以来的改进:自带了对mobile asp .net控件的支持.这在1.0版本是以附加功能方式实现的,现在已经 ...

  9. framework各版本新特性(为面试准备)

    菜鸟D估计描述这些新特性的文章都是烂大街的货色,之所以拿出来分(e)享(xin)一下,有两个原因:1.当年面试的时候有人问到,我不知道该怎么回答:2.项目需要发布了,但是考虑到framework的版本 ...

  10. Entity Framework分页扩展

    Entity Framework分页在我初入门时总是困扰这我,无论是SQL分页还是Entity Framework的分页,总是显得那么麻烦,因此对于Entity Framework单独封装了分页. 一 ...

随机推荐

  1. React Native基础&入门教程:调试React Native应用的一小步

    React Native(以下简称RN)为传统前端开发者打开了一扇新的大门.其中,使用浏览器的调试工具去Debug移动端的代码,无疑是最吸引开发人员的特性之一. 试想一下,当你在手机屏幕按下一个按钮, ...

  2. 虹软2.0 离线人脸识别 Android 开发 Demo

    环境要求1.运行环境 armeabi-v7a2.系统要求 Android 5.0 (API Level 21)及以上3.开发环境 Android Studio 下载地址:https://github. ...

  3. Git:六、分支管理(指针操作)

    1.基本操作 1)创建分支 git branch <name> 2)切换分支 git checkout <name> 1)&2)创建并切换分支 git checkout ...

  4. vue父子组件之间传值

    vue父子组件进行传值 vue中的父子组件,什么是父组件什么是子组件呢?就跟html标签一样,谁包裹着谁谁就是父组件,被包裹的元素就是子组件. 父组件向子组件传值 下面用的script引入的方式,那种 ...

  5. Mysql增量写入Hdfs(一) --将Mysql数据写入Kafka Topic

    一. 概述 在大数据的静态数据处理中,目前普遍采用的是用Spark+Hdfs(Hive/Hbase)的技术架构来对数据进行处理. 但有时候有其他的需求,需要从其他不同数据源不间断得采集数据,然后存储到 ...

  6. SQL Server -- 回忆笔记(四):case函数,索引,子查询,分页查询,视图,存储过程

    SQL Server知识点回忆篇(四):case函数,索引,子查询,分页查询,视图,存储过程 1. CASE函数(相当于C#中的Switch) then '未成年人' else '成年人' end f ...

  7. C++面向对象程序设计之C++的初步知识

    本节内容为学习谭浩强老师编写的<C++面向对象程序设计>的第1章  C++的初步知识  后的个人总结. 在正文开始之前,首先声明,我是Python程序员. 1.2.最简单的C++程序 例1 ...

  8. Python开发【第三篇】基本数据类型

    整型 int __author__ = 'Tang' # 将字符串转换为数字 a = " b = int(a) # 前面是0的数转换,默认base按照十进制 a = " b = i ...

  9. 文本分类实战(三)—— charCNN模型

    1 大纲概述 文本分类这个系列将会有十篇左右,包括基于word2vec预训练的文本分类,与及基于最新的预训练模型(ELMo,BERT等)的文本分类.总共有以下系列: word2vec预训练词向量 te ...

  10. 文本分类实战(二)—— textCNN 模型

    1 大纲概述 文本分类这个系列将会有十篇左右,包括基于word2vec预训练的文本分类,与及基于最新的预训练模型(ELMo,BERT等)的文本分类.总共有以下系列: word2vec预训练词向量 te ...