127

次の QueryDict があるとしましょう。

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

これから辞書を作成したいと思います。たとえば、次のようになります。

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

(ユニコード記号が残っているかどうかは気にしません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 に答える
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

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

アップデート:

myDict = dict(queryDict._iterlists())

注意:_の iterlists メソッドのアンダースコアqueryDict。ジャンゴのバージョン:1.5.1

于 2014-02-01T08:06:58.140 に答える