zoukankan      html  css  js  c++  java
  • 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
    }
     
     
     
  • 相关阅读:
    HDU 1492 The number of divisors(约数) about Humble Numbers
    HDU 2700 Parity
    HDU 4104 Discount
    _getch() 函数,应用于输入密码敲入回车前修改
    函数指针|指针函数|C文件操作
    20160504
    数组指针|指针数组
    短路运算|字符串操作函数|内存mem操作函数
    C/C++ typedef
    Union
  • 原文地址:https://www.cnblogs.com/jiangchunsheng/p/9117397.html
Copyright © 2011-2022 走看看