我通过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中的词典不是很熟悉。
任何帮助都会非常感激。
谢谢!
答案 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)