Django API具有不同级别

时间:2017-05-16 15:53:03

标签: django django-rest-framework

目前,我正在处理的项目有如下API:

api/
    visitors/  # Endpoint returning list of visitors
    visitor-rates/  # Endpoint returning visitors per time
    gift-shop-orders/  # Endpoint returning purchases at the gift shop
    order-rates/  # Endpoint returning purchases per time

我想要做的是将访客和礼品店端点分组到他们自己的子标题下。例如:

api/
    visits/
        visitors/
        rates/
    gift-shop/
        orders/
        rates/

请注意,visitsgift-shop只能列出相应子标题下可用的网址。因此,对/api/visits的GET请求应返回:

{
    "visitors": "/api/visits/visitors",
    "rates": "/api/visits/rates"
}

换句话说,我希望/api/visits//api/gift-shop/具有与Django用于显示API根目录中可用端点的默认路由器视图相同的行为({ {1}})。

我尝试过简单地将网址嵌套在一起。因此,假设我已经为访问者端点和商店端点定义了路由器。我试过了:

/api/

这使得api_patterns = [ url(r'^visits/', include(visitor_router.urls)), url(r'^gift-shop/', include(shop_router.urls)), ] urlpatterns = [ url(r'^api/', include(api_patterns)), ] /api/visits/的请求正确响应。但是,如果我转到/api/gift-shop/,则不会找到指向/api//api/visits的链接。

这让我相信我需要自己嵌套路由器,而不仅仅是URL。但是,我还没有看到任何关于这样做的文档,而我尝试提出自定义解决方案只会导致其他问题。有没有人知道我是否有一种简单,标准的方法可以解决这个问题?

tl; dr:我如何嵌套Django路由器?

1 个答案:

答案 0 :(得分:1)

简短的回答是你没有。如果您使用ViewSets作为简化视图的方法,则需要遵守ViewSet的规则,如果您想拥有嵌套路线,可以使用@detail_route@list_route来实现装饰者,但他们不像框架的其他部分那样表达你的资源,而且是一个体力劳动。

另一种方法是使用名为drf-nested-routers的第三方软件包,该软件包做得非常好,绝对可以满足您的期望。