开发者

how to obtain all values of a multi-valued key from Django's request.GET QueryDict

开发者 https://www.devze.com 2023-01-08 10:59 出处:网络
The Django docs say at http://docs.djangoproject.com/en/dev/ref/request-resp开发者_开发百科onse/#django.http.QueryDict.iteritems thatQueryDict.iteritems() uses the same last-value logic as QueryDict._

The Django docs say at http://docs.djangoproject.com/en/dev/ref/request-resp开发者_开发百科onse/#django.http.QueryDict.iteritems thatQueryDict.iteritems() uses the same last-value logic as QueryDict.__getitem__(), which means that if the key has more than one value, __getitem__() returns the last value.

Let's say print request.GET looks like this:

<QueryDict: {u'sex': [u'1'], u'status': [u'1', u'2', u'3', u'4']}>

If I want to get a string like sex=1&status=1&status=2&status=3&status=4 (standard HTTP GET stuff) the following code won't give the desired results because of the iteritems behavior mentioned above:

mstring = []
for gk, gv in request.GET.iteritems():
    mstring.append("%s=%s" % (gk, gv))
print "&".join(mstring)

What is the most efficient way to obtain the result that I want without too much looping?

Regards.

[EDIT]

I should mention that I am not resorting to QueryDict.urlencode() because there are some keys in that request.GET that I don't want in the string. I could alter the string and take those key=value out, but just wondering if there is a better way to go about this. I realize this information should have been explicitly mentioned.


request.META['QUERY_STRING']

will give the complete query string

or if you want to get the list of values for a given key ex: list of values for status then

request.GET.getlist('status')


This should work:

mstring = []
for key in request.GET.iterkeys():  # "for key in request.GET" works too.
    # Add filtering logic here.
    valuelist = request.GET.getlist(key)
    mstring.extend(['%s=%s' % (key, val) for val in valuelist])
print '&'.join(mstring)


I believe QueryDict.urlencode achieves your desired outcome if all you want to do is print out the QueryDict then just

print request.GET.urlencode()

should do the trick. Let me know if you were trying to do something else and I'll try to help!


request.GET.getlist('status')


It's easy! Just print(dict(request.GET))


To obtain all the values from one. It's better to use getlist("key", default=list). All the values from the key is stored in a list.

request.POST.getlist('key',default=list)


you can cast the querydict into a dictionary

map(int,dict(request.GET)["status"])


There is a useful function in django http utils you can use:

>>> from django.utils.http import urlencode
>>> print(urlencode({"tag": [1, 2, 3], "sentence":2}, doseq=True))

'tag=1&tag=2&tag=3&sentence=2'
0

精彩评论

暂无评论...
验证码 换一张
取 消