2017-06-10 6 views
0

は、私は、次のビューセットを持っていると言うことができますパラメータ。DRF URLからフィルターの代わりにクエリが

私も、私は私のlist方法を再利用しますが、クエリセットをフィルタリングする新しいエンドポイントを、作成したい/企業/ {のcompany_id} /ユーザー

を使用することにより、企業のユーザーをリストすることができるようにしたいです異なっている。 私の考えは、別のメソッドを呼び出すためにこのルートを登録することです。list_by_companyには、kwargsにcompany_idが含まれています。

これをDRFルータクラスに登録するにはどうすればよいですか?

このフィルタリングを実現する方法については、他のアイデアを歓迎しますが、クエリパラメータを使用したくないというのは、長期的には少し混乱します。

答えて

0

私はdefaultrouterにを拡張し、私が欲しいまさにんエントリを追加できることを発見した:

class UserRouter(routers.DefaultRouter): 
    routes = [ 
     routers.Route(
      url=r'^{prefix}{trailing_slash}$', 
      mapping={'get': 'list'}, 
      name='{basename}-list', 
      initkwargs={'suffix': 'List'} 
     ), 
     routers.Route(
      url=r'^companies/(?P<company_id>[0-9]+)/{prefix}{trailing_slash}$', 
      mapping={'get': 'list'}, 
      name='{basename}-list', 
      initkwargs={'suffix': 'List'} 
     ), 
     routers.Route(
      url=r'^{prefix}/{lookup}$', 
      mapping={'get': 'retrieve'}, 
      name='{basename}-detail', 
      initkwargs={'suffix': 'Detail'} 
     ), 
    ] 

私はあまりにもデフォルトルートを書き換えていますので、これは少し冗長です。

その後、私は、直接DRFルータにルータを追加することができます短い:

router = routers.DefaultRouter() 
router.register(r'users', UserViewSet) 
router.routes.append(
    routers.Route(
     url=r'^companies/(?P<company_id>[0-9]+)/{prefix}{trailing_slash}$', 
     mapping={'get': 'list'}, 
     name='{basename}-list', 
     initkwargs={'suffix': 'List'} 
    ), 
) 

私はこのソリューションを使用するつもりですが、私は他の開発者がこのようなケースを解決しているかどうかを知るのが大好きです別の方法:)

+0

ルーカス、私にとっては解決策は複雑だと思われる。必要なものを表現するために別のエンドポイント(ビューセット)を持たないのはなぜですか? DRFのネストされたルート?私は上記のコードを維持することは非常に複雑であると思っています、特にコードベースの非オリジナルの開発者 – DmitrySemenov

関連する問題