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

时间:2018-03-26 00:37:41

标签: django django-rest-framework

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

2 个答案:

答案 0 :(得分:15)

我觉得你有点困惑。

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

  1. APIView:这提供了一些处理方法,用于处理http动词:getpostputpatch和{{1} }。
  2. ViewSet:这是对APIView的抽象,它提供动作作为方法:
    • delete:只读,返回多个资源(http动词:list)。返回一个dicts列表。
    • get:只读,单个资源(http动词:retrieve,但会指望一个id)。返回单个字典。
    • get:创建新资源(http动词:create
    • post:编辑资源(http动词:update/partial_update
    • put/patch:删除资源(http动词:destroy
  3. 两者都可以与普通的django网址一起使用。

    由于使用操作建立了约定,delete也可以成为mapped into a router,这确实很有帮助。

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

    GenericAPIView:对于ViewSet,这会为您提供与您的数据库模型紧密相关的快捷方式。为标准列表和详细信息视图添加常用的行为。为您提供一些属性,例如APIView,也提供serializer_classpagination_class

    GenericViewSet:有许多GenericViewSet,最常见的是filter_backend。他们继承自ModelViewSet,并完整实施了所有操作GenericAPIViewlistretrievedestroy,当然,您也可以选择其中一些read the docs

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

    希望能帮到你!

答案 1 :(得分:3)

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

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

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