2015-06-02 43 views
4

我正在學習Django REST框架(http://tomchristie.github.io/rest-framework-2-docs/,我們仍然在版本2.4)。它是正確的,以限定這樣的類,例如:在Django REST框架的相同視圖中使用ViewSet和APIView mixins是否正確?

class UserView(generics.RetrieveUpdateDestroyAPIView, 
       generics.ListCreateAPIView, 
       viewsets.GenericViewSet): 
    # ... rest of class 

換句話說,是正確的或可以使用*視圖集和* APIView混入/類一起,或者他們旨在作爲兩個完全獨立的概念,不合並?

回答

5

在Django的REST框架的所有版本中,通用API的意見和視圖集類是完全獨立的,但mixins可以在它們之間共享。這是因爲視圖集實際上是從泛型類繼承而來的。

如前所述,您可以使用通用的混入但如果你想建立一個視圖集,只有少數支持的方法,或者如果要覆蓋其中的一個你自己的。

class UserView(mixins.CreateModelMixin, mixins.ListModelMixin, 
       mixins.RetrieveModelMixin, mixins.DestroyModelMixin, 
       mixins.UpdateModelMixin, 
       viewsets.GenericViewSet): 

不要忘了,Django的REST框架並提供您可以使用,以及一個ModelViewSetReadOnlyModelViewSet基類。

6

我不認爲將兩者結合使用是不可取的。他們是爲不同的目的而建造的。

按照該文檔,

ListCreateAPIView:

用於讀寫終端來代表模型 實例的集合。

提供get和post方法處理程序。

擴展:GenericAPIView,ListModelMixin,CreateModelMixin

RetrieveUpdateDestroyAPIView:

提供GET,PUT補丁和刪除方法處理。

擴展:GenericAPIView,RetrieveModelMixin,UpdateModelMixin, DestroyModelMixin

GenericViewSet:

的GenericViewSet類從GenericAPIView繼承,並提供 的get_object,get_queryset方法和其它的默認組通用 查看基本行爲,但不包括默認情況下的任何操作。

ModelViewSet:

的ModelViewSet類從GenericAPIView繼承並且包括 實現各種操作,通過在各種 混入類的行爲混合。

由ModelViewSet類提供的行動是.LIST(), .retrieve(),.create(),.update(),和.destroy()。

隨着ModelViewSet就可以實現所有你打算與你上面的代碼片斷使用CRUD操作

如果你想要一個自定義的功能,即不是所有的方法處理程序,你可以使用通用視圖。但是,如果你想要所有的方法處理程序,那麼視圖集就可以解決你的問題。您甚至可以瀏覽其餘框架代碼,並查看在通用API視圖中繼承的mixin是Viewset中繼承的mixin的子集。 Viewsets基本上將這些視圖捆綁在一起。

你可以做以下,並實現什麼你打算在第一個地方做:

class UserView(viewsets.ModelViewSet): 
    ..... 
相關問題