如何将django QueryDict改为Python Dict?

让我们假装我有以下的QueryDict:

<QueryDict: {u'num': [0], u'var1': [u'value1', u'value2'], u'var2': [u'8']}> 

我想有一本字典,例如:

 {'num': [0], 'var1':['value1', 'value2'], 'var2':['8']} 

(我不在乎unicode符号是否保留或去除。)

如果我按照django网站的build议做了queryDict.dict() ,那么我就失去了属于var1的额外的值,例如:

 {'num': [0], 'var1':['value2'], 'var2':['8']} 

我正在考虑这样做:

 myDict = {} for key in queryDict.iterkeys(): myDict[key] = queryDict.getlist(key) 

有没有更好的办法?

这应该工作: myDict = dict(queryDict.iterlists())

这是我最终使用的:

 def qdict_to_dict(qdict): """Convert a Django QueryDict to a Python dict. Single-value fields are put in directly, and for multi-value fields, a list of all values is stored at the field's key. """ return {k: v[0] if len(v) == 1 else v for k, v in qdict.lists()} 

从我的用法,这似乎让你可以发送回例如一个窗体构造函数列表。

编辑:也许这不是最好的方法。 看起来,如果你想要将QueryDict写入一个文件,无论出于什么疯狂的原因, QueryDict.urlencode()是要走的路。 要重buildQueryDict ,只需执行QueryDict(urlencoded_data)

 from django.utils import six post_dict = dict(six.iterlists(request.POST)) 

如果你不需要数组作为数组,你可以执行以下操作:

 # request = <QueryDict: {u'key': [u'123ABC']}> dict(zip(request.GET.keys(), request.GET.values())) {u'key': u"123ABC" } # Only work for single item lists # request = <QueryDict: {u'key': [u'123ABC',U 'CDEF']}> dict(zip(request.GET.keys(), request.GET.values())) {u'key': u"CDEF" } 

zip是一个强大的工具阅读更多关于它在这里http://docs.python.org/2/library/functions.html#zip

我遇到了一个类似的问题,想从表单中保存任意值作为序列化的值。

我的答案避免明确迭代字典的内容: dict(querydict.iterlists())

为了检索一个与原始函数QueryDict.setlist()的字QueryDict值,一个反函数使用QueryDict.setlist()来填充一个新的QueryDict值。 在这种情况下,我不认为明确的迭代是可以避免的。

我的帮助function如下所示:

 from django.http import QueryDict def querydict_dict(querydict): """ Converts a Django QueryDict value to a regular dictionary, preserving multiple items. """ return dict(querydict.iterlists()) def dict_querydict(dict_): """ Converts a value created by querydict_dict back into a Django QueryDict value. """ q = QueryDict("", mutable=True) for k, v in dict_.iteritems(): q.setlist(k, v) q._mutable = False return q 

更新:

 myDict = dict(queryDict._iterlists()) 

请注意:下划线_在queryDict的iterlists方法中。 Django版本:1.5.1

dict(request.POST)返回一个带数组值的奇怪的Python字典。

 {'start': ['2017-01-14T21:00'], 'stop': ['2017-01-14T22:00'], 'email': ['sandeep@sakethtech.com']} 

其中, {x:request.POST.get(x) for x in request.POST.keys()}中的as {x:request.POST.get(x) for x in request.POST.keys()}返回期望的输出。

 {'start': '2017-01-14T21:00', 'stop': '2017-01-14T22:00', 'email': 'sandeep@sakethtech.com'}