DRF视图集
DRF視圖集
我們在三級視圖中,由于獲取所有數(shù)據(jù)和獲取一條數(shù)據(jù)都是使用GET請求,而二級視圖(三級視圖)只允許有一個(gè)get方法,因此我們在兩個(gè)類中進(jìn)行了設(shè)計(jì),并且這樣剛好將路由分開。而視圖集則提供了新的路由和方法集合,來使我們將路由整合起來,方法整合起來。
ViewSet
該類繼承自APIView,我們可以使用任何標(biāo)準(zhǔn)屬性(如permission_classes,authentication_classes)來控制視圖集上的API。ViewSet不提供任何操作的實(shí)現(xiàn)。為了使用該類,必須重寫該類并顯式定義操作實(shí)現(xiàn)。
通常,我們不會(huì)使用該類。因?yàn)樾枰恐貙憽?/strong>
如果要使用ViewSet,那么將要重寫下面的所有方法,這并不比APIView高明多少,但是當(dāng)你的業(yè)務(wù)非常復(fù)雜的時(shí)候,確實(shí)可以選擇重寫ViewSet來實(shí)現(xiàn)最大的靈活性。
class BookViewSet(viewsets.ViewSet):def list(self, request):passdef create(self, request):passdef retrieve(self, request, pk=None):passdef update(self, request, pk=None):passdef partial_update(self, request, pk=None):passdef destroy(self, request, pk=None):pass一個(gè)ViewSet類同時(shí)提供以下可用屬性
- basename- 用于創(chuàng)建的URL名稱的基礎(chǔ)。
- action- 當(dāng)前動(dòng)作的名稱(例如list,create)。
- detail- 布爾值,指示當(dāng)前操作是否為列表或詳細(xì)視圖配置。
- suffix- 視圖類型的顯示后綴 - 鏡像detail屬性。
下面是使用ViewSet的一個(gè)例子:
GenericViewSet
GenericViewSet繼承自GenericAPIView,作用也與GenericAPIVIew類似,提供了get_object、get_queryset等方法便于列表視圖與詳情信息視圖的開發(fā)。在GenericAPIView中,沒有提供任何動(dòng)作action方法,需要我們自己覆蓋該類并混合所需的混合類,或者明確定義操作實(shí)現(xiàn)action方法。
GenericAPIView用起來也不是非常方便,下面是一個(gè)例子:
# views.py class BookGenericViewSet(GenericViewSet):queryset = BookInfo.objects.all()serializer_class = BookInfoSerializerpagination_class = PageNumlookup_field = 'id'lookup_url_kwarg = 'id'def list(self, request):res = self.paginate_queryset(self.get_serializer(self.get_queryset(), many=True).data)return Response(res)def retrieve(self, request, id):user = get_object_or_404(self.get_queryset(), id=id)ser = self.get_serializer(user)return Response(ser.data) # urls.py urlpatterns = [path('bookgeneric/', BookGenericViewSet.as_view({'get': 'list'})),path('bookgeneric/<int:id>', BookGenericViewSet.as_view({'get': 'retrieve'})), ]ModelViewSet
ModelViewSet繼承自GenericAPIVIew,ListModelMixin、RetrieveModelMixin、CreateModelMixin、UpdateModelMixin、DestoryModelMixin。
ModelViewSet提供了list(),retrieve(),create(),update(),partial_update(),和destroy()方法。這對于簡單的場景是非常實(shí)用的,我們可以只提供queryset,serializer_class,pagination_class等屬性即可。同時(shí)DRF提供了適用于視圖集的路由來方便使用。
ModelViewSet用起來就顯得非常方便了,我們不需要實(shí)現(xiàn)各種方法了,只需要重寫屬性,然后配置路由即可。下面是一個(gè)例子:
# views.py class BookModelViewSet(ModelViewSet):queryset = BookInfo.objects.all()serializer_class = BookInfoSerializerpagination_class = PageNumlookup_field = 'id'lookup_url_kwarg = 'id' # urls.py urlpatterns = [path('bookmodelset/', BookModelViewSet.as_view({'get': 'list', 'post': 'create'})), # 創(chuàng)建和列表路由path('bookmodelset/<int:id>', BookModelViewSet.as_view({'get': 'retrieve', 'put': 'update', 'delete': 'destroy'})), # 刪改查路由 ]只有在ModelViewSet這里,才能感到便捷和強(qiáng)大。但是目前的路由依舊不是讓我們很滿意。好在DRF提供了給視圖集使用的路由方式。如下所示:
from rest_framework.routers import SimpleRouter # 可以處理視圖的路由器 router = SimpleRouter() # 向路由器中注冊視圖集 router.register(r'drfbook', BookModelViewSet, basename='drfbook') #追加路由 urlpatterns += router.urls使用DRF的路由,效果是一樣的,如下所示:
總結(jié)
- 上一篇: BDP个人版产品体验报告:在线数据分析使
- 下一篇: 高仿 IOS遨游哈哈最新版