在Django REST Framework中的同一视图上使用ViewSet和APIView mixins是否正确?

时间:2015-06-02 15:30:04

标签: django python-2.7 django-rest-framework

我正在学习Django REST框架(http://tomchristie.github.io/rest-framework-2-docs/,我们仍在使用2.4版本)。定义这样的类是否正确,例如:

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

换句话说,将* ViewSet和* APIView mixins /类一起使用是正确的还是可能的,或者它们是否是两个完全独立的概念,不能合并?

2 个答案:

答案 0 :(得分:7)

我认为将两者结合使用是明智之举。它们是为不同目的而建造的。

根据文档,

ListCreateAPIView:

  

用于读写端点以表示模型的集合   实例

     

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

     

扩展:GenericAPIView,ListModelMixin,CreateModelMixin

<强> RetrieveUpdateDestroyAPIView:

  

提供get,put,patch和delete方法处理程序。

     

扩展:GenericAPIView,RetrieveModelMixin,UpdateModelMixin,   DestroyModelMixin

<强> GenericViewSet:

  

GenericViewSet类继承自GenericAPIView,并提供   get_object,get_queryset方法和其他泛型的默认设置   查看基本行为,但默认情况下不包含任何操作。

<强> ModelViewSet:

  

ModelViewSet类继承自GenericAPIView并包含   各种动作的实现,通过混合的行为   各种混音课程。

     

ModelViewSet类提供的操作是.list(),   .retrieve(),. create(),. update()和.destroy()。

使用ModelViewSet,您可以实现您打算与上述代码段一起使用的所有 CRUD操作

如果您想要自定义功能,而不是所有方法处理程序,则可以使用通用视图。但是,如果你想要所有方法处理程序,那么视图集就可以解决问题。您甚至可以浏览其余的框架代码,看看在通用API视图中继承的mixins是Viewsets中继承的mixin的子集。 Viewsets基本上将这些视图捆绑在一起。

您可以执行以下操作并首先实现您打算执行的操作:

class UserView(viewsets.ModelViewSet):
    .....

答案 1 :(得分:5)

在Django REST框架的所有版本中,通用API视图和ViewSet类明显是分开的,但mixin可以在它们之间共享。这是因为视图集实际上首先从泛型类继承。

如前所述,如果您只想使用一些受支持的方法构建视图集,或者您想要自己覆盖其中一个方法,则可以使用通用mixins。

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

不要忘记Django REST框架确实提供了您可以使用的ModelViewSetReadOnlyModelViewSet基类。