如何将django QueryDict更改为Python Dict?

Sai*_*irl 97 python django

让我假装我有以下QueryDict:

<QueryDict: {u'num': [0], u'var1': [u'value1', u'value2'], u'var2': [u'8']}>
Run Code Online (Sandbox Code Playgroud)

我想要一本字典,例如:

{'num': [0], 'var1':['value1', 'value2'], 'var2':['8']}
Run Code Online (Sandbox Code Playgroud)

(我不在乎unicode符号是u保留还是继续.)

如果我这样做queryDict.dict(),正如django网站所建议的那样,我会失去属于的额外值var1,例如:

{'num': [0], 'var1':['value2'], 'var2':['8']}
Run Code Online (Sandbox Code Playgroud)

我在想这样做:

myDict = {}
for key in queryDict.iterkeys():
    myDict[key] = queryDict.getlist(key)
Run Code Online (Sandbox Code Playgroud)

有没有更好的办法?

pan*_*ore 179

Django中的新功能> = 1.4.

QueryDict.dict()

https://docs.djangoproject.com/en/stable/ref/request-response/#django.http.QueryDict.dict

  • 好,但不能使用同一个键的多个值 (21认同)
  • 虽然这解决了一些从谷歌来到这个页面的人的问题,但它没有回答OP明确要求为密钥保留多个值的问题. (4认同)

Ale*_*tti 100

这应该工作: myDict = dict(queryDict.iterlists())

  • 在Python 3的Django 1.8中,我需要的只是`dict(queryDict)`. (34认同)
  • 在Django 1.6中,`dict(queryDict.lists())`似乎有效 (5认同)
  • queryDict.iterlists()正在从每个键创建一个列表值,可能是因为你看了列表?,queryDict.iteritems(),如果你知道querydict不包含列表. (4认同)
  • 在django 1.6中:dict(data._iteritems()) (3认同)
  • QueryDict.dict() 会将 QueryDict 转换为平面列表 (2认同)
  • 不适用于 Django &gt;= 2.0。使用 QueryDict.dict() 代替。 (2认同)

Dan*_*aro 13

这就是我最终使用的内容:

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

根据我的用法,这似乎可以为您提供一个列表,您可以将其发送回例如表单构造函数.

编辑:也许这不是最好的方法.看起来如果你想要写QueryDict一个文件出于任何疯狂的原因,那QueryDict.urlencode()就是要走的路.重建QueryDict你只需要做QueryDict(urlencoded_data).

  • 这种方法存在不确定的行为; 在给定键可能具有一个或多个值的情况下,有时可以获取字符串,有时会获得字符串列表. (3认同)

omk*_*dav 11

只需简单地添加

queryDict=dict(request.GET) 或者queryDict=dict(QueryDict)

在您看来,数据将作为 python Dict 保存在 querDict 中。


yty*_*yng 8

from django.utils import six 
post_dict = dict(six.iterlists(request.POST))
Run Code Online (Sandbox Code Playgroud)


kri*_*ard 6

如果您不希望将值作为数组,则可以执行以下操作:

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

zip是一个强大的工具,请阅读http://docs.python.org/2/library/functions.html#zip

  • 我知道这已经快 6 岁了,只是指出谁得到了这个答案:在 Django &gt;= 2.0(可能也适用于旧版本,这只是我正在使用的版本)中,您可以执行 `QueryDict.dict( )`(即`request.POST.dict()`),它将正确返回值。 (3认同)