【问题标题】:Difference between APIView class and viewsets class?APIView 类和视图集类之间的区别?
【发布时间】:2017-05-13 18:37:23
【问题描述】:

APIView 类和 viewsets 类有什么区别? 我正在关注Django REST-framework 官方文档。我认为它缺乏例子。

你能用一个合适的例子来解释上面的区别吗?

【问题讨论】:

标签: django django-views django-rest-framework


【解决方案1】:

APIView 是定义 REST 视图时通常覆盖的最基本的类。您通常定义您的方法,例如 get、put、delete 和其他检查 (http://www.cdrf.co/3.5/rest_framework.views/APIView.html)。使用 APIView,您可以定义您的 view 并将其添加到您的 url,如下所示:

# in views.py
class MyAPIView(APIView):
     ... #here you put your logic check methods you can use
#in urls.py
url(r'^posts$', MyAPIView.as_view()), #List of all the posts

因为某些事情,例如获取 /post/4、删除 /post/4、获取所有帖子、更新和创建新帖子非常常见,DRF 提供了 ViewSet。

但首先在您了解 ViewSets 之前,让我告诉您也有通用类,它们做得很好,但是您需要提供完整的 API 端点,就像我对 MyAPIView 视图所做的那样(再次了解更多信息,请查看@ 987654322@ 或 http://www.django-rest-framework.org/)。所以你必须定义自己的 urls 路径。

但是使用 ViewSets,您创建的 ViewSet 实际上合并了所有上述操作,而且您不需要定义 url 路径,您通常使用为您创建路径的路由器:

 # views.py
 class PostViewSet(ViewSet):  # here you subclass Viewset check methods you can override, you have also ModelViewSet,...


 # urls.py 
 router = routers.DefaultRouter()
 router.register(r'post', PostViewSet, base_name='Post')

【讨论】:

【解决方案2】:

添加到 APIView 的函数与添加到 ViewSet 类的函数不同。

  • APIView:您为要在端点上支持的特定 HTTP 方法添加函数。例如:GET、POST、PUT、PATCH、DELETE

  • ViewSet:您将添加代表您将在典型 API 上执行的操作的函数。例如:列表、创建、检索、更新

【讨论】:

    【解决方案3】:

    Viewsets 和 APIView 都允许我们为端点编写逻辑,但 Viewsets 没有定义映射到 HTTP 方法的函数,而是映射到常见的 API 对象操作

    【讨论】:

      【解决方案4】:

      APIView 允许我们定义与标准 HTTP 方法(如 GET、POST、PUT、PATCH 等)匹配的函数。

      视图集允许我们定义与常见 API 对象操作相匹配的函数,例如:LIST、CREATE、RETRIEVE、UPDATE 等。

      视图集还用于编写执行标准数据库操作和与数据库后端接口的逻辑。并且通常用于现有的数据库模型来管理预定义的对象。

      【讨论】:

        【解决方案5】:

        API 视图

        1. 存在于 rest_framework.views 模块中。

        2. 方法名称反映 HTTP 方法,例如 get()、post()、put()、patch()、delete()

        3. 将视图显式映射到 url

        4. 代码长度较多

        5. API 开发时间较长

        6. 开发者可以完全控制逻辑

        7. 最适合同时使用多个数据源、调用其他 API 等复杂操作

        视图集

        1. 存在于 rest_framework.viewsets 模块中

        2. 方法名称反映数据库模型类操作/操作,如 list()、retrieve()、create()、update()、partial_update() 和 destroy()

        3. 不需要将视图显式映射到 URL。 DefaultRouter 会自动处理 URL 映射

        4. 代码长度更短

        5. API 开发时间更短

        6. 开发人员无法完全控制逻辑

        7. 最适合开发简单的 API,例如为数据库模型开发 CRUD 接口

        【讨论】:

          猜你喜欢
          • 2015-12-11
          • 1970-01-01
          • 2018-11-24
          • 2011-03-30
          • 1970-01-01
          • 1970-01-01
          • 2014-02-26
          • 2013-10-05
          • 2016-09-28
          相关资源
          最近更新 更多