混淆什么时候在django中使用viewsets.Viewset和viewsets.ModelViewSet

时间:2018-04-12 05:46:07

标签: django django-rest-framework

根据django休息框架工作3.7 (viewsets.ViewSet)将为一组标准的创建/检索/更新/破坏风格动作提供路径

(viewsets.ModelViewSet)还将为一组标准的创建/检索/更新/销毁样式操作提供路由

所以什么时候使用这两个类,这两个有什么区别。和get_objects()方法可以覆盖(viewsets.ViewSet)类吗?或者get_objects()方法仅限于(viewsets.ModelViewSet)类?谢谢

3 个答案:

答案 0 :(得分:3)

也许其他人会给出一个更完整的答案,但这里的快速和肮脏。 ModelViewset是一个Viewset,可以非常轻松地为数据模型上的CRUD操作进行配置。如果您希望为models.py中定义的对象公开REST API,那么公开它的最快方法是使用ModelViewSet。视图集在应用程序方面更加开放。您可以使用Viewset构建模型CRUD端点,但您也可以构建一个根本不与模型绑定的端点。 ViewSet具有很大的灵活性,但ModelViewset更受限制,但需要较少的配置来完成大多数基于模型的任务。

答案 1 :(得分:0)

我同意以上回答,只是想在此添加更多点。 ModelViewset与标准Viewset类似,但是它是用来管理模型并具有一些内置功能的,我们也可以根据需要覆盖默认的对象管理器功能,例如create,update等,因此可以使用ModelViewset来管理数据库对象用于模型。

答案 2 :(得分:0)

我需要添加更多详细信息。我正在使用文档代码进一步解释

  1. viewsets.ViewSet

    class ViewSet(ViewSetMixin, views.APIView):
         """
         The base ViewSet class does not provide any actions by default.
         """
         pass
    

这意味着ViewSet继承了两个类ViewSetMixin(它仅将'GET'和'POST'方法绑定到'list'和'create'操作)和views.APIView(这提供了authentication_classes,permission_classes等属性)。因此viewsets.ViewSet默认情况下不提供任何具体的动作方法,但是您必须手动覆盖列表,创建,更新等方法。

  1. viewsets.ModelViewSet
class ModelViewSet(mixins.CreateModelMixin,
                        mixins.RetrieveModelMixin,
                        mixins.UpdateModelMixin,
                        mixins.DestroyModelMixin,
                        mixins.ListModelMixin,
                        GenericViewSet):
         """
         A viewset that provides default create(),retrieve(),update(),
         partial_update(), destroy() and list() actions.
         """
         pass

这意味着 ModelViewSet 继承了所有大多数混合,因此它提供了默认列表,创建,更新等。操作方法和 GenericViewSet (提供get_objectget_queryset方法,您将需要设置这些属性,或覆盖get_queryset() / get_serializer_class(),因为GenericViewSet来自GenericAPIView,因此modelViewSet需要在ModelViewSet中设置的querysetserializer_class属性。

3. get_objects()方法是否可以在(viewsets.ViewSet)类中覆盖?或get_objects()方法仅限于(viewsets.ModelViewSet)类?。

**get_object** and **get_queryset** belongs to **GenericViewSet(GenericAPIView)** class, in ModelViewSet this GenericViewSet inherited by default so it works only in **ModelViewSet** and **get_object** method no use in ViewSet.

有关更多信息,请检查此article,下次您不问任何问题