什么时候应该使用泛型以及什么时候应该使用视图集来构建 API?
我知道它们做同样的事情,但是viewset有路由器,所以在什么情况下泛型比viewset更好?
它们是不同的,让我们看看。
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
还能够映射到路由器,这确实很有帮助。
现在,这两个视图都有快捷方式,这些快捷方式为您提供了一个可供使用的简单实现。
APIView
,这为您提供了与数据库模型紧密映射的快捷方式。添加标准列表和详细视图通常所需的行为。为您提供一些属性,例如 serializer_class
,还提供 pagination_class
、filter_backend
等
GenericViewSet:GenericViewSet有很多种,最常见的是
ModelViewSet
。它们继承自GenericAPIView
,并完整实现了所有actions:list
、retrieve
、destroy
、updated
等。当然,你也可以选择其中的一些,阅读文档。
所以,回答你的问题:DRY,如果你正在做一些非常简单的事情,使用
ModelViewSet
应该足够了,甚至重新定义和调用 super
也足够了。对于更复杂的情况,您可以选择较低级别的课程。
希望对您有帮助!
我对此的黄金法则是,每当我必须重写默认方法以完成列表和详细信息视图的不同规范时,就使用泛型。
例如,当您使用不同的序列化器类来列出资源并通过 id 检索资源详细信息时,我认为使用泛型是更好的选择,因为这两个端点的逻辑可能会单独发展。请记住,保持不同逻辑解耦是一个很好的做法。
当您的端点非常简单并且您不需要自定义列表/创建和检索/更新/删除操作之间的逻辑时,您可以使用视图集,但请记住,最好将其分成两个视图,以防万一运营逻辑开始以不同的路径发展。