tags:

views:

55

answers:

4

The Django docs say at http://docs.djangoproject.com/en/dev/ref/request-response/#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.

+1  A: 

Hey chefsmart,

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!

David
Yes, that does the job. But what I haven't mentioned in the original post (that I should have) is that there are some keys in request.GET that I don't want in the string. I could search the string and take them out, but wondering if there is some other way. I will edit and re-phrase my question.
chefsmart
+2  A: 
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')
Ashok
A: 
request.GET.getlist('status')
Daniel Roseman
+1  A: 

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)
elo80ka
Perfect. Thanks.
chefsmart