2016-10-15 19 views
0

我通過POST接收請求下一個有效載荷通過下面的觀點:轉換成的QueryDict的參數列表

class CustomView(APIView): 

""" 
POST data 
""" 
def post(self, request):     
    extr= externalAPI() 
    return Response(extr.addData(request.data)) 

而在externalAPI類我有addData()功能,我想的QueryDict轉換爲的參數一個簡單的列表:

def addData(self, params):   
    return self.addToOtherPlace(**params) 

換句話說,我所得到的params爲事端,如:

<QueryDict: {u'data': [u'{"object":"a","reg":"1"}'], u'record': [u'DAFASDH']}> 

,我需要它傳遞給addToOtherPlace()函數,如:

addToOtherPlace(data={'object':'a', 'reg': 1}, record='DAFASDH') 

我曾嘗試用不同的方法,但我不得不說,我不是很熟悉Python字典。

任何幫助將非常感激。

謝謝!

回答

1

您可以編寫通過的QueryDict對象散步和有效JSON對象轉換爲Python對象,這是數字爲整數的字符串對象,並返回列表,從列表中的第一個項目一個輔助函數:

import json 

def restruct(d): 
    for k in d: 
     # convert value if it's valid json 
     if isinstance(d[k], list): 
      v = d[k] 
      try: 
       d[k] = json.loads(v[0]) 
      except ValueError: 
       d[k] = v[0] 

     # step into dictionary objects to convert string digits to integer 
     if isinstance(d[k], dict): 
      restruct(d[k]) 
     elif d[k].isdigit(): 
      d[k] = int(d[k]) 


params = {u'data': [u'{"object":"a","reg":"1"}'], u'record': [u'DAFASDH']} 
restruct(params) 
print(params) 
# {'record': 'DAFASDH', 'data': {'object': 'a', 'reg': 1}} 

請注意,此方法修改初始對象就地。你可以做一個deepcopy,並修改副本,而不是如果你要保持原來的對象不變:

import copy 

def addData(self, params): 
    params_copy = copy.deepcopy(params) 
    restruct(params_copy) 
    return self.addToOtherPlace(**params_copy) 
+1

附:我愛你的頭像。 :) – idjaw

+0

嗨@Moses,謝謝你的詳細答案,但我沒有得到預期的結果。當我用params收到的_QueryDict_調用'restruct()'時,我得到了同樣的_QueryDict_。 MEaybe是我失蹤的東西? – Yonirt

+0

我認爲這個方法不適用於* QueryDict *,在函數的開頭添加'params = dict(params.iterlists())'並且讓我知道它是否可行 –