2015-09-07 39 views
3

我不知道为什么文档会说“这并不意味着它总是正确的方法,当使用基于类的视图而不是基于函数的视图时,需要考虑类似的一系列权衡。比单独构建你的观点更不明确。“django rest framework是什么意思在视图和视图集之间取舍?

如果我想让其他类似于ruby-on-rail的api。我认为viewsets是一个很好的方法。

任何人都可以解释一下吗?

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

回答

13

使用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 ,并在详细视图上删除),我会创建一个GizmoViewSet,一个SprocketViewSet并称它为一天。

说我还想给API消费者提供一次性清除所有小玩意的能力。在这种情况下,使用@list_route装饰器将dust方法添加到GizmoViewSet是有意义的。假设我真正想要做的是提供一个单一的端点,API消费者可以一次性关闭所有的GizmoSprocket。这并没有真正很好地映射到任何视图集中,所以我要补充一个下车查看:

import datetime 

from rest_framework.decorators import api_view 
from rest_framework.response import Response 

from my_app.models import Gizmo, Sprocket 

# I used a function-based API view here, but a CBV APIView 
# would work just as well. Matter of personal preference... 
@api_view 
def dust_everything(request): 
    today = datetime.date.today() 
    Gizmo.objects.all().update(last_dusted=today) 
    Sprocket.objects.all().update(last_dusted=today) 
    return Response({"status_of_dusting": "successful"}) 

因此,在这种情况下我也不会被撕裂了我的所有viewsets和享有取而代之;我添加了一个额外的视图来补充现有的视图集,这是有意义的。

+0

这很有趣。你可以附上一些代码来描述吗? –

+2

@BurgerKing“你可以附上一些代码来描述它吗?”你已经有了一个完全一致的答案。 –

+1

如果只有我们其他人有你的理解汤姆。 :) –