如何在django rest框架中复制请求
假设我有这个代码如何在django rest框架中复制请求,django,django-rest-framework,Django,Django Rest Framework,假设我有这个代码 class SnippetList(APIView): """ List all snippets, or create a new snippet. """ def get(self, request, format=None): snippets = Snippet.objects.all() serializer = SnippetSerializer(snippets, many=True)
class SnippetList(APIView):
"""
List all snippets, or create a new snippet.
"""
def get(self, request, format=None):
snippets = Snippet.objects.all()
serializer = SnippetSerializer(snippets, many=True)
return Response(serializer.data)
现在让我们假设在get中,我需要修改request.data
def get(self, request, format=None):
data = modify(request.data)
request.data = data # This don't work as i can't set attribute on request
response = self.post(self, new_request, format=None) # i want to do post method now with new request
serializer = SnippetSerializer(snippets, many=True)
有没有办法做到这一点您不应该在get时修改数据,因为它们通常被标记为“不安全”,因为它们会修改数据状态 您也不想干扰提供的请求。它通常会产生比解决问题更多的问题,并增加一些魔力
如果希望序列化程序的数据多于发送的请求,则应将其传递给序列化程序的save函数。它们将被添加到已验证的_数据中,并在序列化程序的创建/更新方法()中可用。您可以尝试以下方法:
def get(self, request, format=None):
response = self.post(self, request, format=None, data=data ) # i want to do post method now with new request
serializer = SnippetSerializer(snippets, many=True)
现在,您的方法帖子应该是:
def post(self, request, format=None, **kwargs):
original_data = request.data
additional_data = kwargs.get('data') # now you will be able to do whatever you want
# more code goes here
真的不清楚你想做什么。你能给出一个更连贯的用例吗?很可能有一种方法可以实现您想要的功能,但还不清楚您想要的是什么。如果您想重用代码,最好将通用功能放在mixin中,并从这个mixin派生两个调用。@eran我同意这一点,但我需要一个单独的端点来完成我无法完成的任务。我只有一个端点可用,根据一些请求参数,我必须在POST中进行操作GET@JohnKaff,但如果所有内容都在同一个类中,只需将功能拉到第三个方法即可。@eran实际上我没有得到它。你能举个例子吗。