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

 

解析器

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

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

SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。

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

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

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

路由控制

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

1 2 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的功能,格式如下:

1 2 3 4 5 6 7 8 9 10 11 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里),如下:

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

  完整版的urlpatterns配置

1 2 3 4 5 6 7 8 9 10 11 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,如下图:

rest_framework之解析器、路由控制、分页 随笔 第1张

分页

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

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 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类,那么如需分页的时候,只需要在视图类中加入配置参数即可,如下:

1 pagination_class  =  MyPageNumberPagination   

  注意:

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

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

全局配置分页属性

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

1 2 3 4 REST_FRAMEWORK  =  {      .....      "PAGE_SIZE" : 1 }
,

解析器

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

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

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

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

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

路由控制

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

1 2 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的功能,格式如下:

1 2 3 4 5 6 7 8 9 10 11 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里),如下:

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

  完整版的urlpatterns配置

1 2 3 4 5 6 7 8 9 10 11 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,如下图:

rest_framework之解析器、路由控制、分页 随笔 第2张

分页

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

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 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类,那么如需分页的时候,只需要在视图类中加入配置参数即可,如下:

1 pagination_class  =  MyPageNumberPagination   

  注意:

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

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

全局配置分页属性

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

1 2 3 4 REST_FRAMEWORK  =  {      .....      "PAGE_SIZE" : 1 }
扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄