我什么时候应该使用泛型以及什么时候应该使用视图集在 Django Rest Framework 中构建 API?

问题描述 投票:0回答:2

什么时候应该使用泛型以及什么时候应该使用视图集来构建 API?

我知道它们做同样的事情,但是viewset有路由器,所以在什么情况下泛型比viewset更好?

django django-rest-framework
2个回答
134
投票

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

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

  1. APIView:这提供了http动词的方法处理程序:
    get
    post
    put
    patch
    delete
  2. ViewSet:这是对 APIView 的抽象,它提供 actions 作为方法:
    • list
      :只读,返回多个资源(http 动词:
      get
      )。返回字典列表。
    • retrieve
      :只读、单一资源(http 动词:
      get
      ,但需要在 url 中包含 id)。返回单个字典。
    • create
      :创建新资源(http 动词:
      post
    • update/partial_update
      :编辑资源(http 动词:
      put/patch
    • destroy
      :删除资源(http 动词:
      delete

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

由于与actions建立的约定,

ViewSet
还能够映射到路由器,这确实很有帮助。

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

GenericAPIView:对于

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

GenericViewSet:GenericViewSet有很多种,最常见的是

ModelViewSet
。它们继承自
GenericAPIView
,并完整实现了所有actions
list
retrieve
destroy
updated
等。当然,你也可以选择其中的一些,阅读文档

所以,回答你的问题:DRY,如果你正在做一些非常简单的事情,使用

ModelViewSet
应该足够了,甚至重新定义和调用
super
也足够了。对于更复杂的情况,您可以选择较低级别的课程。

希望对您有帮助!


17
投票

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

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

当您的端点非常简单并且您不需要自定义列表/创建和检索/更新/删除操作之间的逻辑时,您可以使用视图集,但请记住,最好将其分成两个视图,以防万一运营逻辑开始以不同的路径发展。

© www.soinside.com 2019 - 2024. All rights reserved.