DRF之注册器响应器分页器
概要
- url注册器
- 响应器
- 分页器
url注册器
通过DRF的视图组件,数据接口逻辑被我们优化到最剩下一个类,接下来,我们使用DRF的url控制器来帮助我们自动生成url,使用步骤如下:
第一步:导入模块
from rest_framework import routers
第二步:实例化一个router对象
router = DefaultRouter()
第三步:将需要自动生成url的接口注册到router中
router.register(r'books', views.BookView)
第四步:生成url
urlpatterns = [
re_path(r'^', include('router.urls')),
]
响应器
之前我们使用DRF的Response类来将数据响应给客户端,不管是POSTMAN还是浏览器,都能浏览到经过格式化后的漂亮的数据,DRF是怎么做的呢?其实就是通过响应器组件
如果我们不需要使用DRF提供给浏览器的格式化后的数据,只需要禁止该响应方式即可:
from rest_framework.renderers import JSONRenderer class BookView(ModelViewSet):
renderer_classes = [JSONRenderer]
throttle_classes = [RateThrottle]
queryset = Book.objects.all()
serializer_class = BookSerializer
这样,浏览器再次访问,接收到的就是普通的json格式数据,而不是经过DRF格式化后的数据,renderer_classes的查找逻辑与之前的解析器等等组件是完全一样的。
分页器
为了服务器性能考虑,也为了用户体验,我们不应该一次将所有的数据从数据库中查询出来,返回给客户端浏览器,如果数据量非常大,这对于服务器来讲,可以说是性能灾难,而对于用户来讲,加载速度将会非常慢。
所以,我们需要控制每次返回给客户端多少数据,这就需要用到分页器,接下来,我们一起来看看DRF的分页器组件。
第一步:导入模块
from rest_framework.pagination import PageNumberPagination
第二步:获取数据
books = Book.objects.all()
第三步:创建分页器
paginater = PageNumberPagination()
第四步:开始分页
paged_books = paginater.paginate_queryset(books, request)
第五步:将分页后的数据进行序列化
serialized_data = BookSerializer(paged_books, many=True)
第六步:返回数据
return Response(serialized_data.data)
# 1.导入模块
from rest_framework.pagination import PageNumberPagination # 自定义分页器类,继承PageNumberPagination
class MyPagination(PageNumberPagination):
page_size = 3
page_query_param = 'p'
page_size_query_param = 'size'
max_page_size = 5 class BookView(APIView): def get(self, request):
# 2.获取数据
queryset = Book.objects.all()
# 3.创建分页器对象
paginater = MyPagination()
# 4.开始分页
paged_books = paginater.paginate_queryset(queryset, request)
# 5.将分页后的数据进行序列化
serializer_books = BookSerializer(paged_books, many=True)
# 6.返回数据
return Response(serializer_books.data)
几个参数介绍
- page_size:用来控制每页显示多少条数据(全局参数名为PAGE_SIZE);
- page_query_param:用来提供直接访问某页的数据;
- page_size_query_param:临时调整当前显示多少条数据
- max_page_size:控制page_size_query_param参数能调整的最大条数
自定义分页器
class MyPagination(PageNumberPagination):
page_size = 2
page_query_param = 'p'
page_size_query_param = 'size'
max_page_size = 5
在ModelViewSet中使用分页器
from rest_framework.viewsets import ModelViewSet
from rest_framework.pagination import PageNumberPagination # 自定义分页器类
class MyPagination(PageNumberPagination):
page_size = 3
page_query_param = 'p'
page_size_query_param = 'size'
max_page_size = 5 class BookView(ModelViewSet): pagination_class = MyPagination # 指定分页器类 queryset = Book.objects.all()
serializer_class = BookSerializer
复制代码
4、分页器全局配置 REST_FRAMEWORK = {
'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',
'PAGE_SIZE': 10 # 每页数目
}
DRF之注册器响应器分页器的更多相关文章
- DRF之注册器、响应器、分页器
一.url注册器 通过DRF的视图组件,数据接口逻辑被我们优化到最剩下一个类,接下来,我们使用DRF的url控制器来帮助我们自动生成url,使用步骤如下: 第一步:导入模块 1 from rest_f ...
- rest认证组件,权限组件,频率组件,url注册器,响应器组件,分页器组件
1.认证组件 1.1 认证组件利用token来实现认证 1.2 token认证的大概流程 用户登录===>获取用户名和密码===>查询用户表 如果用户存在,生成token,否则返回错误信息 ...
- DRF(5) - 频率组件、url注册器、响应器、分页器
一.频率组件 1.使用DRF简单频率控制实现对用户进行访问频率控制 1)导入模块,定义频率类并继承SimpleRateThrottle # 导入模块 from rest_framework.throt ...
- Restful 4 -- 认证组件、权限组件、频率组件、url注册器、响应器、分页器
一.认证组件.权限组件.频率组件总结: 只有认证通过的用户才能访问指定的url地址,比如:查询课程信息,需要登录之后才能查看,没有登录,就不能查看,这时候需要用到认证组件 1.认证组件格式 写一个认 ...
- django url注册器组件, 响应器组件, 分页器组件
一.url注册器的使用 1.1导入模块 from django.urls import re_path, include from .serializer import views from rest ...
- rest-framework频率组件、url注册器、响应器、分页器
频率组件 import time from rest_framework.throttling import BaseThrottle,SimpleRateThrottle IP_DICT = {} ...
- RestFramework之注册器、响应器与分页器
一.注册器的说明与使用 在我们编写url时经常会因请求方式不同,而重复编写某条url,而rest_framework中的注册器帮我节省了很多代码 下面介绍一下如何使用 # 利用注册器来实现路由分发 f ...
- DjangoRestFramework学习三之认证组件、权限组件、频率组件、url注册器、响应器、分页组件
DjangoRestFramework学习三之认证组件.权限组件.频率组件.url注册器.响应器.分页组件 本节目录 一 认证组件 二 权限组件 三 频率组件 四 URL注册器 五 响应器 六 分 ...
- day91 DjangoRestFramework学习三之认证组件、权限组件、频率组件、url注册器、响应器、分页组件
DjangoRestFramework学习三之认证组件.权限组件.频率组件.url注册器.响应器.分页组件 本节目录 一 认证组件 二 权限组件 三 频率组件 四 URL注册器 五 响应器 六 分 ...
随机推荐
- 析构函数和Dispose方法的区别
1. 析构函数(Finalize)只能释放非托管资源, 它是由GC调用. 2. Dispose方法可以释放托管资源和非托管资源,它是由用户手动调用的. 在Dispose()中调用 GC.Suppres ...
- Ceph Monitor基础架构与模块详解
转自:https://www.ustack.com/blog/ceph-monitor/ Ceph rados cluster离不开Monitor,如果没有Monitor,则Ceph将无法执行一条简单 ...
- 通过ISBN获取豆瓣详细书籍资料
手里有四十几万的图书馆书籍的isbn编号,通过isbn去请求豆瓣书籍的详细资料. # -*- coding: utf-8 -*- # @Time : 18-10-2 下午10:27 # @Author ...
- LeetCode OJ:Product of Array Except Self(除己之外的元素乘积)
Given an array of n integers where n > 1, nums, return an array output such that output[i] is equ ...
- 移动元素时,translate要比margin好
比如 做全屏轮播时,父元素往往是被子元素撑起来的,那你设置父元素的margin时,往往会感染到子元素,如下图: 而用translate3d就不会出现这种效果:
- JavaScript碎片
option option 元素定义下拉列表中的一个选项(一个条目). 浏览器将 <option> 标签中的内容作为 <select> 标签的菜单或是滚动列表中的一个元素显示. ...
- mysql基础认识1
一.配置文件 服务端和客户端的字符编码不一样时,可能会导致乱码显示等情况,为了统一两端的字符编码,可以通过配置文件进行实现,当然譬如登录账户等信息也可以进行配置,在启动mysql服务端时会自动读取配置 ...
- go set up on ubuntu
sudo apt-get install golang-go package main import ( "fmt" "runtime" ) func main ...
- (五)js数组方法二
一:数组方法 var arr = []; 1.arr.push()//给数组末尾<添加>元素 2.arr.unshift()//给数组头部<添加>元素 3.arr.shift( ...
- Android UI之LinearLayout详解
※※※摘自http://www.cnblogs.com/salam/archive/2010/10/20/1856793.html LinearLayout是线性布局控件,它包含的子控件将以横向或竖向 ...