如何允许对list_route进行POST,而不是对整个ViewSet进行POST?

时间:2016-06-23 20:57:31

标签: django django-rest-framework http-method

我有一个Game模型并正在为它做相应的REST路由,例如GET /gameGET /game/1

我只希望API消费者能够获得现有游戏。我不希望他们能够任意发布新游戏。相反,他们应该通过一个专门的路线,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 个答案:

答案 0 :(得分:1)

这是一个XY问题。 GameViewSet应该只处理Game以及专门处理游戏的事情。上传时间表不是游戏列表的属性 - 它是一个单独的路线。因此,将其设为APIView,与GameViewSet

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

然后在^upload_schedule$下明确指出。