在django休息框架中的泛型与视图集,如何更喜欢使用哪一个?

Ald*_*don 16 django django-rest-framework

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

Wil*_*oes 33

我觉得你有点困惑.

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

  1. APIView:这提供了一些处理方法,来处理HTTP动词:get,post,put,patch,和delete.
  2. ViewSet:这是对APIView的抽象,它提供了作为方法的动作:
    • list:只读,返回多个资源(http动词:) get.返回一个dicts列表.
    • retrieve:只读,单个资源(http动词:get,但会期望一个id).返回一个单词.
    • create:创建一个新的资源(HTTP动词:post)
    • update/partial_update:编辑资源(HTTP动词:put/patch)
    • destroy:删除一个资源(HTTP动词:delete)

两者都可以与普通的django网址一起使用.

由于使用动作建立的约定,ViewSet还具有映射到路由器的能力,这非常有用.

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

GenericAPIView:for APIView,这为您提供了与数据库模型紧密相关的快捷方式.为标准列表和详细信息视图添加常用的行为.给你喜欢的一些属性serializer_class,也给了pagination_class,filter_backend

GenericViewSet:有许多GenericViewSet,最常见的是ModelViewSet.他们继承GenericAPIView并具有全面实施所有的行动:list,retrieve,destroy,updated,等等.当然,你也可以挑选其中的一些,阅读文档.

所以,回答你的问题:,如果你做的事情非常简单,ModelViewSet应该足够,甚至重新定义和调用super也足够了.对于更复杂的情况,您可以选择较低级别的课程.

希望对你有所帮助!

  • 我在这里找到了一个更好的答案/sf/answers/2931553341/ (2认同)

hug*_*ssa 12

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

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

当您的端点非常简单并且您不需要自定义列表/创建和检索/更新/删除操作之间的逻辑时,您可以使用视图集,但请记住,如果这些操作,最好将它分成两个视图' 逻辑开始以不同的方式发展。