django rest框架中的泛型与视图集,如何选择使用哪一个?

Posted

技术标签:

【中文标题】django rest框架中的泛型与视图集,如何选择使用哪一个?【英文标题】:generics vs viewset in django rest framework, how to prefer which one to use? 【发布时间】:2018-09-04 01:35:18 【问题描述】:

如何选择使用泛型和视图集中的哪一个? 换句话说,我什么时候应该使用泛型,什么时候应该使用 viewset 来构建 api。 我知道它做同样的事情,但是视图集有路由器,那么在什么情况下泛型比视图集更好?

【问题讨论】:

你可以从阅读this开始 【参考方案1】:

他们是不同的,让我们看看。

DRF 有两个主要的视图处理系统:

    APIView:这为 http 动词提供方法处理程序:getpostputpatchdelete。 ViewSet:这是对 APIView 的抽象,它提供 actions 作为方法: list:只读,返回多个资源(http 动词:get)。返回字典列表。 retrieve:只读,单一资源(http 动词:get,但在 url 中需要一个 id)。返回单个字典。 create:创建新资源(http 动词:postupdate/partial_update:编辑资源(http 动词:put/patchdestroy:移除一个资源(http 动词:delete

两者都可以与普通的 django url 一起使用。

由于与actions建立的约定,ViewSet 也可以成为mapped into a router,这真的很有帮助。

现在,这两个视图都有快捷方式,这些快捷方式为您提供了一个可以使用的简单实现。

GenericAPIView:对于APIView,这为您提供了与您的数据库模型紧密映射的快捷方式。为标准列表和详细视图添加通常需要的行为。为您提供一些属性,例如serializer_class,还提供pagination_classfilter_backend

GenericViewSet:有很多GenericViewSet,最常见的是ModelViewSet。它们继承自GenericAPIView,并完整实现了所有动作listretrievedestroyupdated 等。当然,您也可以选择一些其中,read the docs。

所以,回答你的问题:DRY,如果你正在做一些非常简单的事情,使用ModelViewSet 就足够了,甚至重新定义并调用super 也足够了。对于更复杂的情况,您可以选择较低级别的课程。

希望对你有所帮助!

【讨论】:

非常感谢,这很有帮助 混合它们是否是最佳做法,为什么? 这里没有最佳实践。我想说:尽量保持简单,使用ModelViewSet,但有时你需要灵活性,所以使用ViewSetAPIView 很好。但最终,由你决定,如果你愿意,使用APIView 并没有错, 我在这里找到了另一个不错的答案***.com/a/41879333/8454203【参考方案2】:

我对此的黄金法则是在我必须覆盖默认方法以完成列表和详细信息视图的不同规范时使用泛型。

例如,当您有不同的序列化程序类来列出您的资源和通过 id 检索资源详细信息时,我认为使用泛型是一个更好的选择,因为这两个端点的逻辑可能会分开发展。请记住,保持不同逻辑解耦是一种很好的做法。

当您的端点非常简单并且您不需要在列表/创建和检索/更新/删除操作之间自定义逻辑时,您可以使用视图集,但请记住,将其分隔在两个视图中可能会更好如果这些操作的逻辑开始以不同的路径增长。

【讨论】:

混合使用它们是最佳做法吗?为什么?

以上是关于django rest框架中的泛型与视图集,如何选择使用哪一个?的主要内容,如果未能解决你的问题,请参考以下文章

C# 中的泛型与非泛型性能

java的泛型与反射机制

总结java的泛型和内部类

django-rest-framework框架总结之View视图之APIViewGenericAPIView视图集ViewSet

python Django Rest_Framework框架 视图集与路由Routers详解(图文并茂版)

python Django Rest_Framework框架 视图集与路由Routers详解(图文并茂版)