我正在尝试编写一个测试,其中使用 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/