没有/<id>

2024-05-16 04:25:08 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个简单的ModelViewSet

class PersonViewSet(viewsets.ModelViewSet):
  queryset = Person.objects.all().order_by('id')
  serializer_class = PersonSerializer

和网址.py在

^{pr2}$

我需要一个看跌期权

/persons

带着尸体

{
  "id":10,
  "login":"alfredo",
  "avatar_url":"https://avatars.com/2222"
}

更新头像网址。但是当使用url'/persons'和方法PUT进行调用时,我得到响应代码405

{
  "detail": "Method \"PUT\" not allowed."
}

(我知道更好的方法是调用'/persons/10',但是项目的要求是在body请求中添加'/persons'和id)

如何实现这个端点?在


Tags: 方法idurlobjectsputorderallclass
2条回答

PUT方法不是在ModelViewSet类上实现的,您可以在这里查看:http://www.cdrf.co/3.9/rest_framework.viewsets/ModelViewSet.html这是一个很好的文档,说明默认情况下实现了哪些方法。在

要使PUT方法有效,应添加以下代码:

def put(self, request, *args, **kwargs):
        return self.update(request, *args, **kwargs)

编辑:考虑到url是:/persons/<id>

出现此错误是因为URL /person/不用于PUT请求。PUT请求对应于viewsetsupdate方法,update方法需要URL中的ID,例如/person/10/,以便检索要更新的Person对象。在

实际解决此问题的方法是扩展^{}类,以便在列表端点上为PUT添加另一个操作,并自定义views get_object方法以从有效负载中检索ID。在

^{}类中,您将看到定义为:

routes = [
    # List route.
    Route(
        url=r'^{prefix}{trailing_slash}$',
        mapping={
            'get': 'list',
            'post': 'create',
            'put': 'update'  # Add this entry to the mapping dictionary
        },
        name='{basename}-list',
        detail=False,
        initkwargs={'suffix': 'List'}
    ),
    # Dynamically generated list routes. Generated using
    # @action(detail=False) decorator on methods of the viewset.
    DynamicRoute(
        url=r'^{prefix}/{url_path}{trailing_slash}$',
        name='{basename}-{url_name}',
        detail=False,
        initkwargs={}
    ),
    # Detail route.
    Route(
        url=r'^{prefix}/{lookup}{trailing_slash}$',
        mapping={
            'get': 'retrieve',
            'put': 'update',
            'patch': 'partial_update',
            'delete': 'destroy'
        },
        name='{basename}-detail',
        detail=True,
        initkwargs={'suffix': 'Instance'}
    ),
    # Dynamically generated detail routes. Generated using
    # @action(detail=True) decorator on methods of the viewset.
    DynamicRoute(
        url=r'^{prefix}/{lookup}/{url_path}{trailing_slash}$',
        name='{basename}-{url_name}',
        detail=True,
        initkwargs={}
    ),
]

您需要将{'put': 'update'}添加到# List route.部分,然后自定义视图集的update或{}方法,以便它从负载中检索ID。我将提供一个自定义的get_object方法的示例,以支持此用例:

^{pr2}$

相关问题 更多 >