2015-11-25 57 views
1

假設我有這個代碼如何能複製在Django的REST框架請求

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) 

現在讓我們假設在我的東西,我需要修改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) 

有什麼方法做到這一點

+0

它真的不清楚你想要做什麼。你能給出一個更一致的用例嗎?它可能有辦法做你想做的事,但它不清楚你到底想要什麼。 –

+0

如果你想重用代碼,那麼最好把常用的功能放在mixin中,並從這個mixin派生出兩個調用。 – eran

+0

@eran我同意這一點,但後來我需要一個單獨的端點,我不能這樣做。我只有一個端點可用,並且取決於一些請求參數,我必須在GET –

回答

1

你可以嘗試這樣的事:

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 
0

你不應該修改你的數據,因爲他們通常被標記爲「不安全」,因爲他們修改數據狀態。

您不想混淆提供的請求。它通常會產生比解決問題更多的問題,並增加一些魔力。

如果您希望序列化程序比發送請求更多的數據,您應該將它們傳遞給序列化程序的保存功能。他們將被添加到validated_data並提供串行的創建/更新的方法(http://www.django-rest-framework.org/api-guide/serializers/#passing-additional-attributes-to-save

相關問題