在Django中使用viewsets.Viewset和viewsets.ModelViewSet时的困惑

giv*_*Job 3 django django-rest-framework

根据django rest框架3.7,(viewsets.ViewSet)它将为一组标准的create / retrieve / update / destroy样式操作提供路线

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

那么什么时候使用这两个类,这两个之间有什么区别。和get_objects()方法可以在(viewsets.ViewSet)类中重写吗?还是只限于(viewsets.ModelViewSet)类的get_objects()方法?

sah*_*chi 7

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


giv*_*Job 5

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

  1. 视图集.ViewSet

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

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

  1. 视图集.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

Run Code Online (Sandbox Code Playgroud)

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

3.我们可以在(viewsets.ViewSet)类中重写get_objects()方法吗?或者 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.
Run Code Online (Sandbox Code Playgroud)

欲了解更多信息,请查看这篇文章,下次您就不会再问问题了