2016-06-23 6 views
1

私はGameモデルを持っており、それに対して対応するRESTルートを実行しています。 GET /gameGET /game/1などPOSTをlist_routeに許可するが、ViewSet全体には許可しないでください。

私は、APIコンシューマーに既存のゲームを提供したいと思うだけです。私は彼らが新しいゲームを任意にPOSTできるようにしたくありません。むしろ、彼らは特別なルートPOST /game/upload_scheduleを通過する必要があります。

私は、次のしている:

class GameViewSet(viewsets.ModelViewSet): 
    queryset = Game.objects.all() 
    serializer_class = GameSerializer 
    http_method_names = ['get', 'head'] 

    @list_route(methods=['post']) 
    def upload_schedule(self, request): 
     return Response(["foo"]) 

しかし、私POST /game/upload_scheduleは、私がエラーを許可されていない方法を得るとき。その理由は、http_method_namesが発生しないようにするためです。次のように変更した場合:

http_method_names = ['get', 'head', 'post'] 

次に、POST /game/upload_scheduleルートが動作します。しかし、今もそうですPOST /game

どうすればいいですか?

答えて

1

これはXYの問題です。 GameViewSetは、Gameとゲームを扱うものだけを扱うべきです。スケジュールをアップロードすることは、ゲームのリストのプロパティではなく、別のルートです。だから、それAPIViewを作る、GameViewSetから分離:

class UploadSchedule(APIView): 
    def post(self, request): 
     raise NotImplementedError() 

そして​​の下で、明示的にルートをアップ。

関連する問題