Viewsets:用於處理抽象概念,它容許開發人員專一對API的狀態和交互進行建模,並根據通用約定自動處理URL構造django
ViewSet類與View類幾乎相同,除了提供諸如read或update,而不是諸如get或put的處理程序方法url
重構使用ViewSetsspa
from rest_framework import viewsets from .models import Goods from .serializers import GoodsSerializer class GoodsSetPagination(PageNumberPagination): page_size = 10 page_size_query_param = 'page_size' page_query_param = 'p' max_page_size = 100 class GoodsListViewSet(mixins.ListModelMixin, viewsets.GenericViewSet): queryset = Goods.objects.all() serializer_class = GoodsSerializer pagination_class = GoodsSetPagination
明確的將ViewSets綁定到url設計
當咱們定義URL conf時,處理程序方法只會綁定到動做,爲了看看到底發生了什麼,首先從咱們到ViewSets 中明確到建立一組視圖rest
在該goods/urls.py文件中,將咱們到ViewSet類綁定到一組具體到視圖中code
from goods.views import GoodsListViewSet goods_list = GoodsListViewSet.as_view({ 'get': 'list' }) urlpatterns = [ url(r"goods/$", goods_list, name="goods_list"), ]
使用routersrouter
由於咱們使用到是ViewSet類而不是View類,因此咱們實際上不須要本身設計URL,將資源鏈接到視圖和URL的約定能夠使用Router類自動處理,blog
咱們只須要用路由器註冊適當的視圖集,而後讓其完成資源
from django.conf.urls import url, include from goods.views import GoodsListViewSet from rest_framework.routers import DefaultRouter router = DefaultRouter() router.register(r'goods', GoodsListViewSet) urlpatterns = [ url(r'^', include(router.urls)), ]
路由器註冊視圖相似於urlpattern,咱們包含兩個參數-視圖的url前綴和視圖自己,路由
DefaultRouter咱們使用的類也爲咱們自動建立了API根視圖