Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django 如何允许发布到列表路径,但不允许发布到整个视图集?_Django_Django Rest Framework_Http Method - Fatal编程技术网

Django 如何允许发布到列表路径,但不允许发布到整个视图集?

Django 如何允许发布到列表路径,但不允许发布到整个视图集?,django,django-rest-framework,http-method,Django,Django Rest Framework,Http Method,我有一个Game模型,正在为它执行相应的休息路线,例如GET/Game,GET/Game/1,等等 我只希望API消费者获得现有的游戏。我不希望他们能够随意发布新游戏。相反,他们应该通过一条特殊的路线,即发布/游戏/上传时间表 我有以下资料: class GameViewSet(viewsets.ModelViewSet): queryset = Game.objects.all() serializer_class = GameSerializer http_metho

我有一个
Game
模型,正在为它执行相应的休息路线,例如
GET/Game
GET/Game/1
,等等

我只希望API消费者获得现有的游戏。我不希望他们能够随意发布新游戏。相反,他们应该通过一条特殊的路线,即发布/游戏/上传时间表

我有以下资料:

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"])
    http_method_names = ['get', 'head', 'post']
但是,当我
POST/game/upload\u schedule
时,我得到了一个method not allowed错误。原因是
http\u方法\u名称
阻止了这种情况的发生。如果我将其更改为以下内容:

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"])
    http_method_names = ['get', 'head', 'post']
然后,
POST/game/upload\u时间表
路线开始工作。然而,现在也有了
POST/game


如何继续?

这是一个XY问题。
GameViewSet
应该只处理
Game
s和专门处理游戏的东西。上传时间表不是游戏列表的属性,而是一条单独的路线。因此,将其设置为一个
APIView
,与
GameViewSet
分开:

class UploadSchedule(APIView):
    def post(self, request):
        raise NotImplementedError()
然后在
^upload\u schedule$
下显式地将其路由到上