rest_framework之解析器、路由控制、分页

解析器

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

但是我们之前的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
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏测试开发架构之路

【总结】梳理下接口功能测试

1323
来自专栏zingpLiu

浅析Python多线程

学习Python多线程的资料很多,吐槽Python多线程的博客也不少。本文主要介绍Python多线程实际应用,且假设读者已经了解多线程的基本概念。如果读者对进程...

1998
来自专栏Jimoer

JVM学习记录-类加载器

JVM设计团队把类加载阶段中的“通过一个类的全限定名来获取描述此类的二进制字节流”这个动作放到Java虚拟机外面去实现,以便让应用程序自己决定如何去获取所需要的...

681
来自专栏大内老A

.NET Core采用的全新配置系统[5]: 聊聊默认支持的各种配置源[内存变量,环境变量和命令行参数]

较之传统通过App.config和Web.config这两个XML文件承载的配置系统,.NET Core采用的这个全新的配置模型的最大一个优势就是针对多种不同配...

2029
来自专栏Java 源码分析

MyBatis笔记二:配置

1516
来自专栏linux驱动个人学习

Linux进程启动过程分析do_execve(可执行程序的加载和运行)---Linux进程的管理与调度(十一)

我们前面提到了, fork, vfork等复制出来的进程是父进程的一个副本, 那么如何我们想加载新的程序, 可以通过execve来加载和启动新的程序。

3273
来自专栏我的博客

tp3.1.2缓存,日志,调试,模板,标签,视图

1.模板 默认在tpl目录下 默认后缀是.html,可以通过TMPL_TEMPLATE_SUFFIX来配置 如果启用分组,那么模板可能在tpl/分组名/目...

3553
来自专栏一名合格java开发的自我修养

由提交storm项目jar包引发对jar的原理的探索

序:在开发storm项目时,提交项目jar包当把依赖的第三方jar包都打进去提交storm集群启动时报了发现多个同名的文件错误由此开始了一段对jar包的深刻理解...

1071
来自专栏IMWeb前端团队

教你做一个异步的fis3插件

本文作者:IMWeb 黄龙 原文出处:IMWeb社区 未经同意,禁止转载 不清楚fis3是什么的可以先看这个链接 http://fis.baidu.c...

2029
来自专栏xingoo, 一个梦想做发明家的程序员

JSP基本语法

  记录一下自己复习到的知识点,以后看起来也方便。   指令   JSP中三个指令,page,include,taglib page 用于定义页面相关的信息,...

24110

扫码关注云+社区

领取腾讯云代金券