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 }