1. 程式人生 > >rest_framework之解析器、路由控制、分頁

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

控制 img 其他 http 只需要 api 參數 字符 route

解析器

我們都知道,網絡傳輸數據只能傳輸字符串格式的,如果是列表、字典等數據類型,需要轉換之後才能使用

但是我們之前的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之解析器、路由控制、分頁