いいえ、私は基本的な例があります。私はあなたがいくつかの問題があると思うので、まず最初のもの:
マイビュー:
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に添付されたカスタムビュー)
ハッピーコーディングは、これが役立つことを願っています。