【发布时间】:2018-09-04 01:35:18
【问题描述】:
如何选择使用泛型和视图集中的哪一个? 换句话说,我什么时候应该使用泛型,什么时候应该使用 viewset 来构建 api。 我知道它做同样的事情,但是视图集有路由器,那么在什么情况下泛型比视图集更好?
【问题讨论】:
-
你可以从阅读this开始
标签: django django-rest-framework
如何选择使用泛型和视图集中的哪一个? 换句话说,我什么时候应该使用泛型,什么时候应该使用 viewset 来构建 api。 我知道它做同样的事情,但是视图集有路由器,那么在什么情况下泛型比视图集更好?
【问题讨论】:
标签: django django-rest-framework
他们是不同的,让我们看看。
DRF 有两个主要的视图处理系统:
get、post、put、patch 和 delete。list:只读,返回多个资源(http 动词:get)。返回字典列表。retrieve:只读,单一资源(http 动词:get,但在 url 中需要一个 id)。返回单个字典。create:创建新资源(http 动词:post)update/partial_update:编辑资源(http 动词:put/patch)destroy:移除一个资源(http 动词:delete)两者都可以与普通的 django url 一起使用。
由于与actions建立的约定,ViewSet 也可以成为mapped into a router,这真的很有帮助。
现在,这两个视图都有快捷方式,这些快捷方式为您提供了一个可以使用的简单实现。
GenericAPIView:对于APIView,这为您提供了与您的数据库模型紧密映射的快捷方式。为标准列表和详细视图添加通常需要的行为。为您提供一些属性,例如serializer_class,还提供pagination_class、filter_backend 等
GenericViewSet:有很多GenericViewSet,最常见的是ModelViewSet。它们继承自GenericAPIView,并完整实现了所有动作:list、retrieve、destroy、updated 等。当然,您也可以选择一些其中,read the docs。
所以,回答你的问题:DRY,如果你正在做一些非常简单的事情,使用ModelViewSet 就足够了,甚至重新定义并调用super 也足够了。对于更复杂的情况,您可以选择较低级别的课程。
希望对你有所帮助!
【讨论】:
ModelViewSet,但有时你需要灵活性,所以使用ViewSet 或APIView 很好。但最终,由你决定,如果你愿意,使用APIView 并没有错,
我对此的黄金法则是在我必须覆盖默认方法以完成列表和详细信息视图的不同规范时使用泛型。
例如,当您有不同的序列化程序类来列出您的资源和通过 id 检索资源详细信息时,我认为使用泛型是一个更好的选择,因为这两个端点的逻辑可能会分开发展。请记住,保持不同逻辑解耦是一种很好的做法。
当您的端点非常简单并且您不需要在列表/创建和检索/更新/删除操作之间自定义逻辑时,您可以使用视图集,但请记住,将其分隔在两个视图中可能会更好如果这些操作的逻辑开始以不同的路径增长。
【讨论】: