Question :
Let’s pretend I have the following QueryDict:
<QueryDict: {u'num': [0], u'var1': [u'value1', u'value2'], u'var2': [u'8']}>
I’d like to have a dictionary out of this, eg:
{'num': [0], 'var1':['value1', 'value2'], 'var2':['8']}
(I don’t care if the unicode symbol u
stays or goes.)
If I do queryDict.dict()
, as suggested by the django site, I lose the extra values belonging to var1
, eg:
{'num': [0], 'var1':['value2'], 'var2':['8']}
I was thinking of doing this:
myDict = {}
for key in queryDict.iterkeys():
myDict[key] = queryDict.getlist(key)
Is there a better way?
Answer #1:
This should work: myDict = dict(queryDict.iterlists())
Answer #2:
New in Django >= 1.4.
QueryDict.dict()
https://docs.djangoproject.com/en/stable/ref/request-response/#django.http.QueryDict.dict
Answer #3:
This is what I’ve ended up using:
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()}
From my usage this seems to get you a list you can send back to e.g. a form constructor.
EDIT: maybe this isn’t the best method. It seems if you want to e.g. write QueryDict
to a file for whatever crazy reason, QueryDict.urlencode()
is the way to go. To reconstruct the QueryDict
you simply do QueryDict(urlencoded_data)
.
Answer #4:
from django.utils import six
post_dict = dict(six.iterlists(request.POST))
Answer #5:
If you do not want the values as Arrays you can do the following:
# 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 is a powerful tool read more about it here http://docs.python.org/2/library/functions.html#zip
Answer #6:
I ran into a similar problem, wanting to save arbitrary values from a form as serialized values.
My answer avoids explicitly iterating the dictionary contents: dict(querydict.iterlists())
In order to retrieve a dictionary-like value that functions as the original, an inverse function uses QueryDict.setlist()
to populate a new QueryDict
value. In this case, I don’t think the explicit iteration is avoidable.
My helper functions look like this:
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
Answer #7:
just simply add
queryDict=dict(request.GET)
or queryDict=dict(QueryDict)
In your view and data will be saved in querDict as python Dict.
Answer #8:
Update:
myDict = dict(queryDict._iterlists())
Please Note : underscore _
in iterlists method of queryDict
. Django version :1.5.1