2017-05-16 5 views
1

Derzeit ist das Projekt arbeite ich an hat eine API wie folgt aus:Django API mit verschiedenen Ebenen

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 

Was ich möchte, ist zu tun Gruppe der Besucher und Schenkungssteuer Endpunkte unter ihrem eigenen Unter -Überschrift. Zum Beispiel:

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

Beachten Sie, dass visits und gift-shop nur die Aufgabe, die Auflistung aus der URLs, die unter der jeweiligen Tarifstelle zur Verfügung stehen. So sollte eine GET-Anfrage an /api/visits zurück:

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

Mit anderen Worten, würde Ich mag /api/visits/ und /api/gift-shop/ das gleiche Verhalten wie die Standard-Router Ansicht von Django verwendet haben, für die Endpunkte in der Wurzel verfügbar Anzeigen von die API (/api/).


Ich habe versucht, einfach nur die URLs verschachteln. Angenommen, ich habe Router für die Endpunkte der Besucher und Endpunkte des Shops definiert. Ich habe versucht:

api_patterns = [ 
    url(r'^visits/', include(visitor_router.urls)), 
    url(r'^gift-shop/', include(shop_router.urls)), 
] 

urlpatterns = [ 
    url(r'^api/', include(api_patterns)), 
] 

Das es so, dass Anfragen macht /api/visits/ und /api/gift-shop/ reagieren richtig. Wenn ich jedoch zu /api/ gehe, werden keine Verbindungen zu /api/visits oder /api/gift-shop gegeben.

Dies führt zu der Annahme, dass ich die Router selbst verschachteln muss, nicht nur die URLs. Ich habe jedoch keine Dokumentation darüber gesehen, und meine Versuche, eine maßgeschneiderte Lösung zu finden, haben nur zu anderen Problemen geführt. Weiß jemand, ob es eine einfache Standardmethode gibt, die ich vermisse?


tl; dr: Wie schiebe ich Django Router?

+0

hast du vergessen, urlpatterns anzufügen? 'urlpatterns + = [ URL (r '^ api /', include (api_patterns)), ]'? – MaximeK

Antwort

1

Die kurze Antwort ist Sie nicht. Wenn Sie ViewSets als Möglichkeit zur Vereinfachung Ihrer Ansichten verwenden, müssen Sie sich an die Regeln von ViewSets halten, und wenn Sie verschachtelte Routen haben möchten, können Sie dies mit den @detail_route und @list_route Dekoratoren tun, aber sie drücken dies nicht aus Ihre Ressourcen wie der Rest des Frameworks, und es ist eine manuelle Arbeit.

Die Alternative, verwendet ein Drittanbieter-Paket namens drf-nested-routers, das ist wirklich gut gemacht und kann definitiv tun, was Sie erwarten.

+0

Danke für die Hinweise. Ich habe das 'drf-nested-routers'-Paket sehr genau untersucht, aber es scheint, als ob es eine Regex für die Auflösung von Primärschlüsseln zwischen den einzelnen Ebenen in der Hierarchie gibt. In meinem Fall gibt es keine solchen Regexes, und ich habe noch keine Möglichkeit gefunden, diese Anforderung zu überschreiben. Wenn Sie in meinem Fall erweitern könnten, wie man 'drf-nested-router' verwendet, wäre das sehr hilfreich. – WillR

+0

Oder, wenn Sie erweitern könnten, auf was "Regeln von ViewSets" Sie sich beziehen und wie mein Anwendungsfall diese Regeln bricht, wäre das auch wirklich hilfreich. – WillR

Verwandte Themen