python - 'patch' 方法在收到 URL 中的 pk 时生成 500 错误

标签 python django django-rest-framework django-views django-queryset

我正在发送一个 PATCH 请求(自然地)传递一个 pk,我得到一个 TypeError: patch() got an unexpected keyword argument 'pk'

这些是我发送的请求参数:

Request URL: http://localhost:8000/api/task/toggle-done/1/
Request headers: {'Authorization': 'Token 13f2f18ea582e9c585c817ba52358b5b19e696a8', 'Content-Type': 'application/json', 'Content-Length': '0'}
Request method: PATCH
Request body: None

这是 URL 模式:

path('task/toggle-done/<int:pk>/', TaskToggleDoneAPIView.as_view(), name='task_toggle_done'),

这是TaskToggleDoneAPIView实现

class TaskToggleDoneAPIView(generics.UpdateAPIView):
    http_method_names = ['patch']
    authentication_classes = [TokenAuthentication]
    permission_classes = [permissions.IsAuthenticated,IsObjectOwner]
    queryset = Task.objects.all()
    lookup_field = 'pk'
    serializer_class = TaskSerializer

    def patch(self, request,):
        instance = self.get_object()
        instance.done = not instance.done
        instance.save()
        serializer = self.get_serializer(instance)
        return Response(serializer.data)

这是我收到的错误:

gtd-api-1    | Internal Server Error: /api/task/toggle-done/1/
gtd-api-1    | Traceback (most recent call last):
gtd-api-1    |   File "/usr/local/lib/python3.8/dist-packages/django/core/handlers/exception.py", line 47, in inner
gtd-api-1    |     response = get_response(request)
gtd-api-1    |   File "/usr/local/lib/python3.8/dist-packages/django/core/handlers/base.py", line 181, in _get_response
gtd-api-1    |     response = wrapped_callback(request, *callback_args, **callback_kwargs)
gtd-api-1    |   File "/usr/local/lib/python3.8/dist-packages/django/views/decorators/csrf.py", line 54, in wrapped_view
gtd-api-1    |     return view_func(*args, **kwargs)
gtd-api-1    |   File "/usr/local/lib/python3.8/dist-packages/django/views/generic/base.py", line 70, in view
gtd-api-1    |     return self.dispatch(request, *args, **kwargs)
gtd-api-1    |   File "/usr/local/lib/python3.8/dist-packages/rest_framework/views.py", line 509, in dispatch
gtd-api-1    |     response = self.handle_exception(exc)
gtd-api-1    |   File "/usr/local/lib/python3.8/dist-packages/rest_framework/views.py", line 469, in handle_exception
gtd-api-1    |     self.raise_uncaught_exception(exc)
gtd-api-1    |   File "/usr/local/lib/python3.8/dist-packages/rest_framework/views.py", line 480, in raise_uncaught_exception
gtd-api-1    |     raise exc
gtd-api-1    |   File "/usr/local/lib/python3.8/dist-packages/rest_framework/views.py", line 506, in dispatch
gtd-api-1    |     response = handler(request, *args, **kwargs)
gtd-api-1    | TypeError: patch() got an unexpected keyword argument 'pk'
gtd-api-1    | "PATCH /api/task/toggle-done/1/ HTTP/1.1" 500 78560
gtd-api-1    | Internal Server Error: /api/task/toggle-done/1/
gtd-api-1    | Traceback (most recent call last):

如果我一切顺利,lookup_field = 'pk'应该妥善处理。

最佳答案

patch() 方法必须接收 pk 作为参数,因此:

class TaskToggleDoneAPIView(generics.UpdateAPIView):
    http_method_names = ['patch']
    authentication_classes = [TokenAuthentication]
    permission_classes = [permissions.IsAuthenticated,IsObjectOwner]
    queryset = Task.objects.all()
    lookup_field = 'pk'
    serializer_class = TaskSerializer

    def patch(self, request, pk):
        instance = self.get_object()
        instance.done = not instance.done
        instance.save()
        serializer = self.get_serializer(instance)
        return Response(serializer.data)

关于python - 'patch' 方法在收到 URL 中的 pk 时生成 500 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75501148/

相关文章:

python - 获取分支名称我在 Pull Requests 上使用 GitHub Webhook 处理

Django:查找多对多关系中的所有值,其中相关集的所有元素都符合特定条件

django - FactoryBoy "create"策略似乎无法保存 django 模型

python - 如何获取序列化器方法字段中的所有实例

python-docx不添加图片

python - Django: "Form object has no attribute..."错误

c# - 在 Python 中模拟 C# 的 sbyte(8 位有符号整数)转换

python - 测试 Django 命令文件或标准输入

django - APITestCase 中的请求 header

Django rest 框架嵌套自引用对象