在可浏览的api_root中混合View和ViewSet

时间:2016-02-08 18:41:08

标签: python django django-rest-framework

我有browsable API

restaurant_router = DefaultRouter()
restaurant_router.register(r'rooms', RoomsViewSet)
restaurant_router.register(r'printers', PrintersViewSet)
restaurant_router.register(r'shifts', ShiftsViewSet)

urlpatterns = patterns('',
    url(r'^$', api_root),
    url(r'^restaurant/$',
        RestaurantView.as_view(),
        name='api_restaurants_restaurant'),
    url(r'^restaurant/', include(restaurant_router.urls)),
)

api_root我可以链接到指定路线:

@api_view(('GET',))
def api_root(request, format=None):
    return Response({
        'restaurant': reverse('api_restaurants_restaurant', request=request, format=format),
    })

或者我可以使用DefaultRouter生成的可浏览API,如文档中所述:

  

我们正在使用的DefaultRouter类也会自动创建API   我们的root视图,所以我们现在可以删除我们的api_root方法   观点模块。

如果我想混合ViewSet和普通视图,并在同一个API根目录中显示所有内容,该怎么办? DefaultRouter仅列出其控制的ViewSet

3 个答案:

答案 0 :(得分:1)

您只需使用一种方法即可将视图定义为ViewSet。 因此,您可以在路由器中注册它,它将与ViewSets在一个空间中。

http://www.django-rest-framework.org/api-guide/viewsets/

答案 1 :(得分:-1)

使用DefaultRouter看起来不是一个简单的方法,你必须建立自己的路由器。如果有任何安慰,DefaultRouter用于生成APIRoot视图的逻辑非常简单,您可以轻松地根据DefaultRouter类推送自己的类似路由器(例如,修改ApiRoot类实现以获取要包含的其他URL,您可以执行此操作方法的数量,例如将它们传递到您的路由器的构造函数中):

https://github.com/tomchristie/django-rest-framework/blob/86470b7813d891890241149928d4679a3d2c92f6/rest_framework/routers.py#L263

答案 2 :(得分:-1)

来自http://www.django-rest-framework.org/api-guide/viewsets/

  

ViewSet类只是一种基于类的View,它不提供任何方法处理程序,如.get()或.post(),而是提供诸如.list()和.create()之类的操作。

这意味着我们可以扩展您的ViewSet:

def other_rooms_view(request):
    return Response(...)


class RoomsViewSet(ViewSet):
    ...

    def list(self, request):
        return other_rooms_view(request)

restaurant_router = DefaultRouter()
restaurant_router.register(r'rooms', RoomsViewSet)