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

Sco*_*ord 4 django python-2.7 django-rest-framework

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

class UserView(generics.RetrieveUpdateDestroyAPIView,
               generics.ListCreateAPIView, 
               viewsets.GenericViewSet):
    # ... rest of class
Run Code Online (Sandbox Code Playgroud)

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

Rah*_*pta 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,并通过混合各种mixin类的行为来包含各种操作的实现.

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

有了ModelViewSet可以实现所有CRUD操作,你打算与你上面的代码片断使用.

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

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

class UserView(viewsets.ModelViewSet):
    .....
Run Code Online (Sandbox Code Playgroud)


Kev*_*own 5

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

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

class UserView(mixins.CreateModelMixin, mixins.ListModelMixin,
               mixins.RetrieveModelMixin, mixins.DestroyModelMixin,
               mixins.UpdateModelMixin, 
               viewsets.GenericViewSet):
Run Code Online (Sandbox Code Playgroud)

不要忘了,Django的REST框架并提供了一个ModelViewSetReadOnlyModelViewSet您可以使用,以及基类.