如何从Django的request.GET QueryDict中获取多值键的所有值

che*_*art 17 django

Django文档在http://docs.djangoproject.com/en/dev/ref/request-response/#django.http.QueryDict.iteritems上说,QueryDict.iteritems()使用相同的最后值逻辑QueryDict.__getitem__(),这意味着如果密钥有多个值,__getitem__()返回最后一个值.

让我们说print request.GET看起来像这样:

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

如果我想得到一个像sex=1&status=1&status=2&status=3&status=4(标准的HTTP GET东西)的字符串,由于iteritems上面提到的行为,以下代码将无法提供所需的结果:

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

在没有太多循环的情况下获得我想要的结果的最有效方法是什么?

问候.

[编辑]

我应该提一下,我不会诉诸,QueryDict.urlencode()因为该请求中有一些键.我不想在字符串中.我可以改变字符串并取出那些key =值,但只是想知道是否有更好的方法来解决这个问题.我意识到应该明确提到这些信息.

Ash*_*hok 23

request.META['QUERY_STRING']
Run Code Online (Sandbox Code Playgroud)

将给出完整的查询字符串

或者如果要获取给定密钥ex的值列表:则为状态值列表

request.GET.getlist('status')
Run Code Online (Sandbox Code Playgroud)

  • 也适用于POST - `request.POST.getlist('foo')` (4认同)

elo*_*0ka 13

这应该工作:

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)
Run Code Online (Sandbox Code Playgroud)


Dav*_*eat 8

我相信QueryDict.urlencode可以实现你想要的结果,如果你想做的只是打印出QueryDict

print request.GET.urlencode()
Run Code Online (Sandbox Code Playgroud)

应该做的伎俩.如果您正在尝试做其他事情,请告诉我,我会尽力帮忙!

  • `data = request.GET.copy()`,然后从你不需要的数据中删除东西,然后执行`data.urlencode()`. (3认同)