django-restful:viewsets和generics區別

viewsets 和generics 都是對下層的APIView和mixin進行組合

mixin包含的類

    CreateModelMixin  #新建一個信息
    ListModelMixin     #一個列表信息
    RetrieveModelMixin  #單獨一個信息
    UpdateModelMixin  #更新一個信息
    DestroyModelMixin

首先是generices包含

GenericViewSet(viewsets)         -drf
    GenericAPIView               -drf
        APIView                  -drf
            View                 -django

GenericAPIView(views.APIView)  #對APIView進行封裝
CreateAPIView(mixins.CreateModelMixin,            #組合一個create
                    GenericAPIView)
ListAPIView(mixins.ListModelMixin,
                  GenericAPIView)
RetrieveAPIView(mixins.RetrieveModelMixin,
                      GenericAPIView)
DestroyAPIView(mixins.DestroyModelMixin,
                     GenericAPIView)
UpdateAPIView(mixins.UpdateModelMixin,
                    GenericAPIView)
ListCreateAPIView(mixins.ListModelMixin,
                        mixins.CreateModelMixin,
                        GenericAPIView)
RetrieveUpdateAPIView(mixins.RetrieveModelMixin,
                            mixins.UpdateModelMixin,
                            GenericAPIView)

這樣的組合 可以實現不同的功能 但是也有一個麻煩的地方
以 ListAPIView(mixins.ListModelMixin,GenericAPIView) 為例

class ListAPIView(mixins.ListModelMixin,
                  GenericAPIView):
    """
    Concrete view for listing a queryset.
    """
    def get(self, request, *args, **kwargs):
        return self.list(request, *args, **kwargs)

他需要寫一個get 方法 與list進行綁定 所以有點麻煩

但是ViewSets就可以省略這一步
Viewsets中包含的方法

ViewSetMixin(object)
ViewSet(ViewSetMixin, views.APIView)
GenericViewSet(ViewSetMixin, generics.GenericAPIView)
ReadOnlyModelViewSet(mixins.RetrieveModelMixin,
                           mixins.ListModelMixin,
                           GenericViewSet)
ModelViewSet(mixins.CreateModelMixin,
                   mixins.RetrieveModelMixin,
                   mixins.UpdateModelMixin,
                   mixins.DestroyModelMixin,
                   mixins.ListModelMixin,
                   GenericViewSet)

ViewSets封裝了兩個類 ViewSetMixin(object) 和ViewSet(ViewSetMixin, views.APIView)
然后進行組合 就可以實現里面的方法 就不用在view中綁定HTTP和他們的關系了
而是在urls配置中進行綁定
有兩種方法
第一就是

# 商品列表頁
goods_list = GoodsListViewSet.as_view({
    # 綁定關系  還可以更簡單
    'get': 'list',
})
urlpatterns = [
  url(r'^goods/', goods_list,name='goods_list),
]

第二種就更簡單了

from rest_framework.routers import DefaultRouter

from goods.views import GoodsListViewSet

router = DefaultRouter()
# 配置goods的url
router.register(r'goods', GoodsListViewSet)
#以后再注冊進再寫一個router就行了 

同時viewsets 還提供了一些action給我們 更加方便

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容