2016-06-23 9 views
1

Ich habe ein Modell Game und mache die entsprechenden REST-Routen dafür, z.B. GET /game, GET /game/1 usw.Wie erlaube ich POST zu einer list_route, aber nicht zu dem gesamten ViewSet?

Ich möchte nur API-Consumer, um vorhandene Spiele zu erhalten. Ich möchte nicht, dass sie neue Spiele willkürlich POSTIEREN können. Vielmehr sollten sie dafür eine spezielle Route, POST /game/upload_schedule, durchlaufen müssen.

Ich habe folgendes:

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"]) 

Allerdings, wenn ich POST /game/upload_schedule, erhalte ich eine Methode, Fehler nicht erlaubt. Der Grund ist, dass http_method_names verhindert, dass es passiert. Wenn ich es wie folgt ändern:

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

Dann wird die POST /game/upload_schedule Strecke funktioniert. Jetzt tut dies aber auch POST /game!

Wie gehe ich vor?

Antwort

1

Dies ist ein XY-Problem. Die GameViewSet sollte nur mit Game s befassen und Dinge, die speziell mit Spielen zu tun haben. Das Hochladen des Zeitplans ist keine Eigenschaft einer Liste von Spielen - es ist eine separate Route. Also, macht es zu einem APIView, getrennt von den GameViewSet:

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

Und dann führen Sie es ausdrücklich unter ^upload_schedule$ auf.