我正在学习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 /类一起使用是正确的还是可能的,或者它们是否是两个完全独立的概念,不能合并?
答案 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框架确实提供了您可以使用的ModelViewSet
和ReadOnlyModelViewSet
基类。