【问题标题】:How to use router in Django REST not for viewsets, but for generic views?如何在 Django REST 中使用路由器不是用于视图集,而是用于通用视图?
【发布时间】:2016-06-06 15:56:49
【问题描述】:

我有一个关于 DjangoREST 和路由的非常基本的问题。

当我需要注册 rest_framework.viewsets 时,我会这样做(来自文档的示例):

router = routers.SimpleRouter()
router.register(r'users', UserViewSet)
router.register(r'accounts', AccountViewSet)

但是如何添加来自 rest_framework.generics 包的路由器视图?我应该定制路由器 (http://www.django-rest-framework.org/api-guide/routers/#custom-routers) 吗?最佳做法是什么?

【问题讨论】:

  • 仍然是 urlpatterns 是最好的。想多了,我的脑海里出现了问题:P

标签: django-rest-framework


【解决方案1】:

但是如何添加来自 rest_framework.generics 包的路由器视图?

你没有。 ViewSets 为rest_framework.generics 添加了几个兼容层,以便与路由器一起使用。

我应该定制路由器 (http://www.django-rest-framework.org/api-guide/routers/#custom-routers) 吗?最佳做法是什么?

如果你想使用非视图集视图,你将不得不编写常规的 Django url。

我的感觉是真正的问题是完全不同的,可能是“我如何将视图集限制为仅某些操作”。

在这种情况下,ModelViewSet 的声明提供了答案:

class ViewSet(ViewSetMixin, views.APIView):
    """
    The base ViewSet class does not provide any actions by default.
    """
    pass


class GenericViewSet(ViewSetMixin, generics.GenericAPIView):
    """
    The GenericViewSet class does not provide any actions by default,
    but does include the base set of generic view behavior, such as
    the `get_object` and `get_queryset` methods.
    """
    pass


class ModelViewSet(mixins.CreateModelMixin,
                   mixins.RetrieveModelMixin,
                   mixins.UpdateModelMixin,
                   mixins.DestroyModelMixin,
                   mixins.ListModelMixin,
                   GenericViewSet):
    """
    A viewset that provides default `create()`, `retrieve()`, `update()`,
    `partial_update()`, `destroy()` and `list()` actions.
    """
    pass

如您所见,您可以通过选择所需的 mixins 并从 GenericViewSet 继承来专门化 ModelViewSet

【讨论】:

  • 不幸的是,您的回答假设您正在使用模型,但情况并非总是如此。仅仅因为您有一个不在视图集中的视图,并不意味着该视图正在利用模型来生成渲染结果。
  • 是否使用模型与这里无关。您可以在没有模型的情况下使用 ViewSet,但路由器仅适用于 ViewSet。
【解决方案2】:

在通用视图的情况下,它们不使用路由器,因为它们是基于类的视图源- drf documentation for class-based views

【讨论】:

    猜你喜欢
    • 2016-04-25
    • 2020-03-06
    • 2021-01-24
    • 2017-04-07
    • 2015-08-04
    • 2016-01-30
    • 2020-01-21
    • 2018-12-30
    • 2015-01-23
    相关资源
    最近更新 更多