2016-11-22 3 views
0

私のREST APIには、TestTestRunという2つのエンティティがあります。 TestRun(適切なTestRunフィールドを含む)を作成するPOSTリクエストを送信できるようにしたいが、このリクエストのURLはapi/v1/testrunではなくapi/v1/test/{id}/startでなければなりません。 私は@detail_route使用して、私はURLをカスタマイズできることを知っているが、その要求はまだapi/v1/test/{id}に送信されます。別のリソースを作成する1つのリソースのURLへのポスト

class TestViewSet(viewsets.ModelViewSet): 
    queryset = Test.objects.all() 
    serializer_class = TestSerializer 

    @detail_route(methods=['post'], url_path='start') 
    def start_test(self, request, pk=None): 
     pass 

class TestRunViewSet(viewsets.ModelViewSet): 
    queryset = TestRun.objects.all() 
    serializer_class = TestRunSerializer 

おそらく、いくつかの高度にカスタマイズされたルータは、ここで必要とされていますか?

答えて

1

いいえ、私は基本的な例があります。私はあなたがいくつかの問題があると思うので、まず最初のもの:

マイビュー:

class TestViewSet(viewsets.ModelViewSet): 
    queryset = Test.objects.all() 
    serializer_class = TestSerializer 

    @detail_route(methods=['post'], url_path='start', serializer_class=TestRunSerializer) 
    def start_test(self, request, pk=None): 
     serializer = self.get_serializer(data=request.data) 
     if serializer.is_valid(): 
      # add here TestRun object 
      return Response(serializer.data, status=status.HTTP_200_OK) 


class TestRunViewSet(viewsets.ModelViewSet): 
    queryset = TestRun.objects.all() 
    serializer_class = TestRunSerializer 

私のURL:

router = SimpleRouter() 
router.register('test', TestViewSet) 
router.register('test-run', TestRunViewSet) 

urlpatterns = router.urls 

と設定のURL:

このシナリオでは
urlpatterns = [ 
    url(r'^api/v1/', include('droute.urls')) 
] 

あなたはTestとTestRunモデルの完全なCRUDを持っています - 一つはapi/vi/testの下にあり、二つ目はapi/v1/test-runの中にあります。

detail_routeデコレータはあなたの追加ルートを作成します。/ API/V1 /テスト/:ID /スタート

しかし、これはCRUDは、API/V1 /テスト・ランの下にもはやアクセス可能であることを意味しません。

api/v1/test-runでの作成を許可しない場合は、TestOnlyModelViewSetをTestRunViewSetのベースとして使用する必要があります。これにより、リストエンドポイントでGETのみが許可されます:api/v1/test-run詳細エンドポイント上で:

ルータでは、マジックを作る必要はありません。たとえばSimpleRouterで十分です。

ネストされたルーターを作成する場合は、少し複雑になります。あなたはstackoverflowを検索することができます - それに関する多くの記事がありました。しかし、私は、ネストされたルータを使用するためにあなたを落胆だろう正直に言うと、私はあなたがここで確認することができます:)これで作業は喜びであることを感じることはありません: はhttps://github.com/alanjds/drf-nested-routers

私は思う(しかし、私はほとんど、またはNONOの情報を持っている)最高のことあなたのためのAPIは、このようなものになるだろう:

  • /API/V1 /テスト - テストのために> CRUD
  • /API/V1 /テスト/:ID /スタート - >テストPOSTを開始
  • /api/v1/test /:id/runs->実行リストを取得するGET(TestViewSetまたはネストされたルータのlist_route)
  • /api/v1/test /:id/runs /:run_id - >実行の詳細を取得します(これは問題があります:ネストする必要があることを意味するため)(またはURLに添付されたカスタムビュー)

ハッピーコーディングは、これが役立つことを願っています。

関連する問題