如何将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'}