2017-05-16 3 views
1

がありますDjangoのAPIは現在、私が働いているプロジェクトは以下のようなAPIを

​​

私は何をしたいのですがグループが独自のサブの下で訪問者やギフトショップのエンドポイントであります-見出し。たとえば、次のようにvisitsgift-shopのみそれぞれの小見出しの下に用意されていたURLをリストの仕事を持っていることを

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

注意。だから、/api/visitsにGETリクエストを返す必要があります:つまり

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

、私はのルートで利用できるエンドポイントを表示するためにはDjangoで使用されるデフォルトルータのビューと同じ振る舞いを持つように/api/visits//api/gift-shop/が欲しいですAPI(/api/)。


私は単純にURLを入れ子にしてみました。そこで、訪問者エンドポイントとショップエンドポイント用のルーターを定義したとします。私が試した:

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または/api/gift-shopへのリンクは表示されません。

これは、URLだけでなく、ルータ自身も入れ子にする必要があると私に信じています。私はこれを行う上でドキュメントを見たことはありませんでしたが、私のカスタムソリューションを試してみると、他の問題が発生しました。これを行うためのシンプルで標準的な方法があるかどうか誰にも分かっていますか?


tl; dr:Djangoルータをネストするにはどうすればよいですか?

+0

urlpatternsを追加するのを忘れましたか? 'urlpatterns + = [ url(r '^ api /'、(api_patterns)を含む)、 ]'? – MaximeK

答えて

1

短い答えはです。はありません。 ViewSetsをビューを簡略化する方法として使用している場合は、ViewSetのルールに従う必要があります。ネストされたルートを使用する場合は、@detail_route@list_routeデコレータで行うことができますが、残りのフレームワークのようなあなたのリソースは、それは手作業です。

代わりに、drf-nested-routersと呼ばれるサードパーティのパッケージを使用しています。これは本当にうまくいっていて、間違いなくあなたが期待していることを行うことができます。

+0

ポインタをありがとう。私は 'drf-nested-routers'パッケージをよく見ていますが、階層の各レベル間で主キーを解決するための正規表現があると仮定しているようです。私の場合にはこのような正規表現はありません。その要件をまだ上書きする方法は見つけられていません。私の場合に 'drf-nested-routers'を使う方法を拡張することができれば、本当に役に立ちます。 – WillR

+0

また、あなたが参照している「ViewSetsのルール」やユースケースがこれらのルールをどのように破るかをさらに拡大することができれば、それは本当に役立つでしょう。 – WillR

関連する問題