我不知道为什么文档说“这并不意味着它始终是正确的方法。在使用基于类的视图而不是基于函数的视图时,需要考虑类似的一组权衡。使用视图集不像单独构建你的观点那么明确。“
如果我想制作休息api,这类似于ruby-on-rail。我认为viewsets
是一个很好的方法。
有人可以解释一下吗?
答案 0 :(得分:17)
使用viewsets
优于views
的主要优点是简洁。在简单的情况下,您可以使用更少的代码行完成更多工作。
主要的缺点是viewsets
所做的简化假设可能并不总是适合您正在使用的问题空间。与Django中基于类的视图一样,如果您尝试将错误的模式应用于问题你最终可以做更多的工作而不是你需要解决问题。
我的个人启发式是,如果我在模型上进行完整的CRUD操作,我会从viewsets
开始,然后从那里开始,直到我觉得他们提供的便利不再值得我带来的麻烦在那个具体的例子;如果我使用的API端点不能映射到任何模型,我更有可能只使用view
。
修改强>:
在回复您的评论时,这是代码中的一个示例。如果我有以下型号:
<强> models.py 强>
from django.db import models
class Gizmo(models.Model):
name = models.CharField(blank=True, null=False)
last_dusted = models.DateField(null=True)
class Sprocket(models.Model):
nom = models.CharField(blank=True, null=False)
last_dusted = models.DateField(null=True)
我想支持具有正常含义的标准HTTP方法(即列表视图中的GET和POST以及详细视图上的GET,PUT和DELETE),我创建了{{1} },GizmoViewSet
,并称之为一天。
假设我还希望为API消费者提供立即清除所有小玩意的能力。在这种情况下,使用SprocketViewSet
装饰器向dust
添加GizmoViewSet
方法是有意义的。假设我真正想做的是提供一个端点,该API消费者可以立即清除所有@list_route
和Gizmo
s。这并不能很好地映射到任何一个视图集,所以我要添加一个视图:
Sprocket
因此,在这种情况下,我不会撕毁我的所有视图并用视图替换它们;我添加了一个额外的视图来补充现有的视图集。