解析器

我们都知道,网络传输数据只能传输字符串格式的,如果是列表、字典等数据类型,需要转换之后才能使用

但是我们之前的rest_framework例子都没有转换就直接可以使用了,这是因为rest_framework有一套解析器,

默认他会帮我们转换3种类型的数据,分别是,JSONParser,FormParser,MultiPartParser

而如果我们需要转换其他数据,需要在视图类里配置parser_classes参数,如下:

from rest_framework.parsers import JSONParser,FormParser,MultiPartParser,FileUploadParser
parser_classes = [JSONParser,FormParser,FileUploadParser]

路由控制

我们之前在写例子的时候,视图类已经封装到最精简版本了,但是url变的比之前复杂了,如下:

  url(r'^publishes/$', views.PublishViewSet.as_view({'get':'list','post':'create'})),
url(r'^publishes/(?P<pk>\d+)/$', views.PublishViewSet.as_view({'get':'retrieve','put':'update','delete':'destroy','patch':'partial_update'})),

  上面只是一个视图类对应的url,如果项目做的很大,那么url会变的非常臃肿,

而rest_framework给我们封装了一种自动注册url的功能,格式如下:

from django.conf.urls import url
from django.contrib import admin
from app01 import views from django.conf.urls import include
from rest_framework import routers # 实例化一个routers对象
routers = routers.DefaultRouter()
# 往对象里注册(添加)url
routers.register('publishes',views.PublishViewSet)

  然后,在urlpatterns中添加已经注册的url(在routers.urls里),如下:

url(r'',include(routers.urls))

  完整版的urlpatterns配置

urlpatterns = [
url(r'^admin/', admin.site.urls), url(r'^login/', views.Login.as_view()), url(r'^authors/$', views.AuthorsView.as_view()),
url(r'^authors/(\d+)/$', views.AuthorsDetailView.as_view()), url(r'',include(routers.urls))
]

  这个时候,rest_framework会帮我们自动添加了4个url,如下图:

分页

继承APIView类的视图中添加分页

from rest_framework.pagination import PageNumberPagination
class MyPageNumberPagination(PageNumberPagination):
# 定义一个PageNumberPagination的子类
# 如需改变参数,重写其属性即可
page_size = 6 #每页显示条数
page_query_param = 'page' # url中的参数的key
page_size_query_param="size" # 可以在url中使用size参数临时改变当页显示的数目
max_page_size=10 # 可以在url中使用size参数临时改变当页显示的数目,但是最大只能显示10条 class AuthorsView(APIView):
def get(self,request):
'''分页展示作者列表'''
author_list = models.Author.objects.all()
# 分页
# 实例化一个自己定义的MyPageNumberPagination对象
pnp = MyPageNumberPagination()
# 调用paginate_queryset方法来生成新的author_list
# 参数分别为,author_list,request以及当前的视图
page_author_list = pnp.paginate_queryset(author_list,request,self)
# 在将新生成的page_author_list序列化
auts = serializer.AuthorModelSerializers(page_author_list,many=True)
return Response(auts.data)

继承ModelViewSet类的视图中添加分页

如果我们的视图继承了ModelViewSet类,那么如需分页的时候,只需要在视图类中加入配置参数即可,如下:

pagination_class = MyPageNumberPagination

  注意:

    1、MyPageNumberPagination类是我们自己定义的类,见上面一个示例。

    2、pagination_class后面直接跟上类名即可,无需加列表(因为分页不想其他组件,分页只可能有一个)

全局配置分页属性

只需要在REST_FRAMEWORK配置中加入 配置属性的键值对即可,如下:

REST_FRAMEWORK = {
.....
"PAGE_SIZE":1
}

rest_framework之解析器、路由控制、分页的更多相关文章

  1. Django_rest_framework_渲染器/解析器/路由控制/分页

    目录 渲染器 解析器 路由控制 分页 渲染器 简介 什么是渲染器 根据 用户请求URL 或 用户可接受的类型,筛选出合适的 渲染组件. 渲染器的作用 序列化.友好的展示数据 渲染器配置 首先要在set ...

  2. DRF url控制 解析器 响应器 版本控制 分页(常规分页,偏移分页,cursor游标分页)

    url控制 第二种写法(只要继承了ViewSetMixin) url(r'^pub/$',views.Pub.as_view({'get':'list','post':'create'})), #获取 ...

  3. rest-framework解析器,url控制,分页,响应器,渲染器,版本控制

    解析器 1.json解析器 发一个json格式的post请求.后台打印: request_data---> {'title': '北京折叠'} request.POST---> <Q ...

  4. rest_framework之解析器详解 05

    解析器就是服务端写api,对于前端用户发来的数据进行解析.解析完之后拿到自己能用数据. 本质就是对请求体中的数据进行解析. django的解析器 post请求过来之后,django 的request. ...

  5. rest_framework之ModelViewSet、路由控制、序列化组件快速搭建项目雏形

    以UserInfo表登陆接口为例 ModelViewSet的用法十分简单,定义一个视图类,指定一个模型表,指定一个序列化类即可帮我们完成增删改查等功能 示例: # 视图层 from app01.MyS ...

  6. Django框架深入了解_04(DRF之url控制、解析器、响应器、版本控制、分页)

    一.url控制 基本路由写法:最常用 from django.conf.urls import url from django.contrib import admin from app01 impo ...

  7. Django rest-framework框架-解析器

    解析器: 开始: django: request.POST/ request.body 满足一下两个要求POST中才有值 1. 如果请求头中的 Content-Type: application/x- ...

  8. restful(3):认证、权限、频率 & 解析器、路由控制、分页、渲染器、版本

    models.py中: class UserInfo(models.Model): name = models.CharField(max_length=32) psw = models.CharFi ...

  9. 5 解析器、url路由控制、分页、渲染器和版本

    1 数据解析器 1 什么是解析器 相当于request 中content-type 对方传什么类型的数据,我接受什么样的数据:怎样解析 无论前面传的是什么数据,都可以解开 例如:django不能解析j ...

随机推荐

  1. iOS中获取本地通讯录联系人以及汉字首字母排序

    iOS中获取手机通讯录中的联系人信息: /*** 加载本地联系人*/ - (void)loadLocalContacts { //新建一个通讯录类 ABAddressBookRef addressBo ...

  2. mysql 无法插入中文

    MySQL数据库默认编码已经是utf8了, default-character-set = utf8,可是向数据库中表中插入中文时,却老是出现 ....\xB5\xA5\xD1\xA1 for col ...

  3. masm下几种常见函数调用方式

    masm没有fastcall调用方式,其特点为: 1 第一个参数放入ecx,第二个参数放入edx: 2 如果有剩余参数则从右向左压栈: 3 被调用函数清理栈(平衡栈): 4 若有返回值放入eax: 5 ...

  4. 恶补web之六:javascript知识(2)

    若要向html添加新元素,必须首先创建该元素,然后向一个已存在的元素追加该元素 <div id="div1"> <p id="p1">这 ...

  5. java——内部类

    内部类:将一个类定义在另一个类的里面,对里面那个类就称为内部类.内部类的访问特点: 1,内部类可以直接访问外部类的成员. 2,外部类要访问内部类,必须建立在内部类的对象.什么时候用? 一般用于类的设计 ...

  6. ES6浅谈之Promise

    首先来回想一下Promise对象的写法: // 方法1 let promise = new Promise ( (resolve, reject) => { if ( success ) { . ...

  7. node七-required、缓存

    学会查API,远比会几个API更重要. 核心模块意义 -如果只是在服务器运行javascript代码,并没有多大意义,因为无法实现任何功能>读写文件.访问网络 -Node的用处在于它本身还提供可 ...

  8. Mysql 查询条件中字符串尾部有空格也能匹配上的问题

    一.表结构 TABLE person id name 1 你 2 你(一个空格) 3 你(二个空格) 二.查询与结果 select * from person where `name` = ? 无论 ...

  9. RabbitMQ Linux(Redhat6.5)安装(二 )

    一.安装erlang 由于RabbitMq的linux运行环境需要erlang环境,所以需要先安装erlang: 1.erlang下载: http://erlang.org/download/(我下载 ...

  10. margin-right没有效果的问题

    margin-right其实有效果的,只是在默认即标准流的情况的下显示不出来效果.如果脱离标准流呢?想到这个,就立马在css文件中加了一个:float:right;然后在测试的时候就能看到margin ...