我有一个Game
模型并正在为它做相应的REST路由,例如GET /game
,GET /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
现在也是如此!
我该如何处理?
答案 0 :(得分:1)
这是一个XY问题。 GameViewSet
应该只处理Game
以及专门处理游戏的事情。上传时间表不是游戏列表的属性 - 它是一个单独的路线。因此,将其设为APIView
,与GameViewSet
:
class UploadSchedule(APIView):
def post(self, request):
raise NotImplementedError()
然后在^upload_schedule$
下明确指出。