如何将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()) 
Django中的新增function> = 1.4。
 QueryDict.dict() 
https://docs.djangoproject.com/en/stable/ref/request-response/#django.http.QueryDict.dict
这是我最终使用的:
 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'}