【发布时间】:2017-05-13 18:37:23
【问题描述】:
APIView 类和 viewsets 类有什么区别? 我正在关注Django REST-framework 官方文档。我认为它缺乏例子。
你能用一个合适的例子来解释上面的区别吗?
【问题讨论】:
标签: django django-views django-rest-framework
APIView 类和 viewsets 类有什么区别? 我正在关注Django REST-framework 官方文档。我认为它缺乏例子。
你能用一个合适的例子来解释上面的区别吗?
【问题讨论】:
标签: django django-views django-rest-framework
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')
【讨论】:
添加到 APIView 的函数与添加到 ViewSet 类的函数不同。
APIView:您为要在端点上支持的特定 HTTP 方法添加函数。例如:GET、POST、PUT、PATCH、DELETE
ViewSet:您将添加代表您将在典型 API 上执行的操作的函数。例如:列表、创建、检索、更新
【讨论】:
Viewsets 和 APIView 都允许我们为端点编写逻辑,但 Viewsets 没有定义映射到 HTTP 方法的函数,而是映射到常见的 API 对象操作
【讨论】:
APIView 允许我们定义与标准 HTTP 方法(如 GET、POST、PUT、PATCH 等)匹配的函数。
视图集允许我们定义与常见 API 对象操作相匹配的函数,例如:LIST、CREATE、RETRIEVE、UPDATE 等。
视图集还用于编写执行标准数据库操作和与数据库后端接口的逻辑。并且通常用于现有的数据库模型来管理预定义的对象。
【讨论】:
API 视图
存在于 rest_framework.views 模块中。
方法名称反映 HTTP 方法,例如 get()、post()、put()、patch()、delete()
将视图显式映射到 url
代码长度较多
API 开发时间较长
开发者可以完全控制逻辑
最适合同时使用多个数据源、调用其他 API 等复杂操作
视图集
存在于 rest_framework.viewsets 模块中
方法名称反映数据库模型类操作/操作,如 list()、retrieve()、create()、update()、partial_update() 和 destroy()
不需要将视图显式映射到 URL。 DefaultRouter 会自动处理 URL 映射
代码长度更短
API 开发时间更短
开发人员无法完全控制逻辑
最适合开发简单的 API,例如为数据库模型开发 CRUD 接口
【讨论】: