127

假设我有以下 QueryDict:

<QueryDict: {u'num': [0], u'var1': [u'value1', u'value2'], u'var2': [u'8']}>

我想要一本字典,例如:

{'num': [0], 'var1':['value1', 'value2'], 'var2':['8']}

(我不在乎 unicode 符号u是留下还是消失。)

如果我按照django 站点queryDict.dict()的建议这样做,我会丢失属于的额外值,例如:var1

{'num': [0], 'var1':['value2'], 'var2':['8']}

我正在考虑这样做:

myDict = {}
for key in queryDict.iterkeys():
    myDict[key] = queryDict.getlist(key)

有没有更好的办法?

4

14 回答 14

232

Django >= 1.4 中的新功能。

QueryDict.dict()

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

于 2013-03-07T23:01:03.867 回答
111

这应该有效:myDict = dict(queryDict.iterlists())

于 2012-11-12T18:57:47.840 回答
16

这就是我最终使用的:

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()}

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

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

于 2014-02-28T16:18:03.450 回答
8
from django.utils import six 
post_dict = dict(six.iterlists(request.POST))
于 2015-06-29T11:12:23.497 回答
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" } 

zip 是一个强大的工具在这里阅读更多关于它http://docs.python.org/2/library/functions.html#zip

于 2013-11-28T16:58:34.380 回答
6

只需简单地添加

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

在您的视图中,数据将作为 python Dict 保存在 querDict 中。

于 2018-11-30T19:17:52.497 回答
4

我遇到了类似的问题,想将表单中的任意值保存为序列化值。

我的回答避免显式迭代字典内容:dict(querydict.iterlists())

为了检索一个类似于字典的值作为原始值,逆函数用于QueryDict.setlist()填充一个新QueryDict值。在这种情况下,我不认为显式迭代是可以避免的。

我的辅助函数如下所示:

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
于 2014-01-22T13:04:46.780 回答
3

更新:

myDict = dict(queryDict._iterlists())

请注意:_iterlists 方法中的下划线queryDict。Django 版本:1.5.1

于 2014-02-01T08:06:58.140 回答
3

dict(request.POST)返回一个带有数组包装值的怪异 python 字典。

{'start': ['2017-01-14T21:00'], 'stop': ['2017-01-14T22:00'], 'email': ['sandeep@sakethtech.com']}

其中 as{x:request.POST.get(x) for x in request.POST.keys()}返回预期输出。

{'start': '2017-01-14T21:00', 'stop': '2017-01-14T22:00', 'email': 'sandeep@sakethtech.com'}
于 2017-01-03T15:24:56.097 回答
3

几乎Django 2.2没有干净的解决方案:

  1. QueryDict.dict()最简单,但它会破坏QueryDict列表作为值,例如:
from django.http.request import QueryDict, MultiValueDict

query_dict = QueryDict('', mutable=True)
query_dict.update(MultiValueDict({'a': ['one', 'two']}))
query_dict.update({'b': 'three'})

for key, value in query_dict.dict().items():  # ---> query_dict.dict()
    print(key, value)

将输出

a two  # <--- missed 'one'
b three
  1. dict(QueryDict)更好,因为它将制作正确的列表字典:
from django.http.request import QueryDict, MultiValueDict

query_dict = QueryDict('', mutable=True)
query_dict.update(MultiValueDict({'a': ['one', 'two']}))
query_dict.update({'b': 'three'})

for key, value in dict(query_dict).items():  # ---> dict(query_dict)
    print(key, value)

将输出

a ['one', 'two']
b ['three']

哪个是对的。

于 2019-08-05T08:58:07.540 回答
1

这就是我解决这个问题的方法:

dict_ = {k: q.getlist(k) if len(q.getlist(k))>1 else v for k, v in q.items()}
于 2017-12-19T04:42:05.993 回答
1

和我一样,你可能更熟悉Dict()python 中的方法。但是,QueryDict()它也是一个易于使用的对象。例如,也许您想从request.GET QueryDict().

你可以这样做request.GET.__getitem__(<key>)

QueryDict()文档:https ://docs.djangoproject.com/en/2.0/ref/request-response/#django.http.QueryDict

于 2018-02-01T19:19:47.143 回答
1

我尝试了这两种方法dict(request.POST)request.POST.dict()并意识到如果你有嵌套在你的list值中,later( ) 只允许我访问嵌套列表中的最后一项,而前者( ) 允许我访问嵌套列表中的所有项目。'var1':['value1', 'value2']request.POSTrequest.POST.dict()dict(request.POST)

我希望这可以帮助别人。

于 2019-07-22T19:46:44.327 回答
0

你可以使用一个简单的技巧

queryDict._mutable = False
# Change queryDict
your_dict = {'num': [0], 'var1':['value1', 'value2'], 'var2':['8']}
queryDict.upate(your_dict)
# reset the state
queryDict._mutable = True 

我认为这会更好地帮助你: 这个 QueryDict 实例是不可变的

于 2021-03-19T12:54:25.387 回答