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給我們 更加方便