django休息框架意味着在视图与视图集之间进行权衡?

时间:2015-09-07 03:29:43

标签: python django python-2.7 view django-rest-framework

我不知道为什么文档说“这并不意味着它始终是正确的方法。在使用基于类的视图而不是基于函数的视图时,需要考虑类似的一组权衡。使用视图集不像单独构建你的观点那么明确。“

如果我想制作休息api,这类似于ruby-on-rail。我认为viewsets是一个很好的方法。

有人可以解释一下吗?

文件链接: http://www.django-rest-framework.org/tutorial/6-viewsets-and-routers/#trade-offs-between-views-vs-viewsets

1 个答案:

答案 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_routeGizmo s。这并不能很好地映射到任何一个视图集,所以我要添加一个视图:

Sprocket

因此,在这种情况下,我不会撕毁我的所有视图并用视图替换它们;我添加了一个额外的视图来补充现有的视图集。