如何在Django REST中使用路由器不用于视图集,而是用于通用视图?

时间:2016-06-06 15:56:49

标签: django-rest-framework

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

当我需要注册rest_framework.viewsets时,我正在做这样的事情(来自documentaton的例子):

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

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

2 个答案:

答案 0 :(得分:4)

  

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

你没有。 ViewSet为rest_framework.generics添加了一些兼容层,以便与路由器配合使用。

  

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

如果你想使用非视图集视图,你将会编写常规的Django网址。

我的感觉是真正的问题是完全不同的,并且会像“我如何将视图集仅限于某些操作”。

在这种情况下,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并继承ModelViewSet来专门化GenericViewSet

答案 1 :(得分:0)

如果是通用视图,则它们不使用路由器,因为它们是基于类的视图, drf documentation for class-based views