python - patch() 得到了意外的关键字参数

标签 python python-3.x http django-rest-framework

我正在尝试编写一个测试,其中使用 patch 更新对象。

class Search(models.Model):
    id_search = models.AutoField(primary_key=True)
    id_user = models.IntegerField(null=False)
    .
    .
    archive = models.BooleanField(default=False)
 def test_archive_search(self):

        user = User(id_user=75720912,
                    login='Client:75720912',
                )
        user.save()

        search = Search(
                        id_user=75720912,
                        .
                        .
                        archive=False
                )
        search.save()

        url = reverse('search-update', kwargs={'id_search':1})
        data = {'archive': True}
        response = self.client.patch(url, data, format='json')
        self.assertEqual(response.status_code, status.HTTP_201_CREATED)
url(r'^search-update/(?P<id_search>\d+)$', SearchUpdateView.as_view(), name='search-update')

class SearchUpdateView(generics.UpdateAPIView):
    serializer_class = SearchSerializer
    def get_object(self,id_search):
        return Search.objects.get(id_search=id_search)

    def patch(self, request):
        id_search = self.request.query_params.get('id_search', None)

        search_object = self.get_object(id_search=id_search)
        serializer = SearchSerializer(search_object, data=request.data, partial=True) 

        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data, status=status.HTTP_201_CREATED)
        return Response(serializer.data, status=status.HTTP_400_BAD_REQUEST)

并收到此错误:

TypeError: patch() got an unexpected keyword argument 'id_search'

有趣的是,当 url 为:

url(r'^search-update/$', SearchUpdateView.as_view(), name='search-update')

SearchUpdateView 使用给定的查询参数可以正常工作。

编辑

我发现在测试时将id_search传递给patch可以解决这个问题,但它会破坏工作 View 。

class SearchUpdateView(generics.UpdateAPIView):
    serializer_class = SearchSerializer
    def get_object(self, id_search):
        return Search.objects.get(id_search=id_search)

    def patch(self, request, id_search):
        #id_search = self.request.query_params.get('id_search', None) 


        search_object = self.get_object(id_search=id_search)
        serializer = SearchSerializer(search_object, data=request.data, partial=True) 

        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data, status=status.HTTP_201_CREATED)
        return Response(serializer.data, status=status.HTTP_400_BAD_REQUEST)

我仍然不知道如何将它们组合在一起。

最佳答案

如果您以这种方式定义 url,则 patch 方法将获取 id_search 参数作为关键字参数,如错误所示。

相反,您将检索它,就像它作为查询参数一样,即不是 url 路径的一部分,而是作为 search-update?id_search=

鉴于您在获取时将 None 作为默认值传递,因此当您省略它时它会起作用。

所以选择你想要走的路。

如果 url 定义正确,则将 id_search 参数添加到 patch 方法的签名中 并删除手动检索它的代码。

或者按照上面评论中的建议,通过为参数分配默认值 None 并从请求中检索它(如果它不是路径的一部分)来执行这两项操作

关于python - patch() 得到了意外的关键字参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59797063/

相关文章:

python - 如何修复 "ValueError: invalid literal for int() with base 10: ' ' 的发生。每当需要 pyobjc 时,包括安装 pyobjc

python - 在带有 Django 模型的 python 脚本中使用多重处理

python-3.x - 如何编辑 Discord 机器人命令的描述,如默认帮助命令中所示?

http - 使用 Chrome/WebKit 调试 Access-Control-Allow-Origin

python - 创建一个Numpy FFT带通滤波器

python - 在 Python 中读取 .csv 而不遍历整个文件?

python - 使用 bool 键值对将字符串转换为字典格式

python-3.x - 为什么 Pycharm 返回向上箭头而不是清理屏幕?

http - 有什么办法可以在 markdown 中显示 URL 参数的 'wordwrap' 长 URL?

http - 关于Http大文件下载的MD5校验