将QueryDict转换为参数列表

时间:2016-10-15 20:42:53

标签: python json django dictionary

我通过POST请求通过以下视图收到下一个有效负载:

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 个答案:

答案 0 :(得分: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)