45

Djangoアプリケーションに辞書があると想像してみてください。

dict = {'a': 'one', 'b': 'two', }

ここで、この辞書からGETパラメーターのurlencodedリストを簡単に作成したいと思います。もちろん、辞書、urlencodeキーと値をループして、自分で文字列を連結することもできますが、もっと簡単な方法があるはずです。QueryDictインスタンスを使用したいと思います。QueryDictはdictのサブクラスであるため、何らかの方法で可能になるはずです。

qdict = QueryDict(dict) # this does not actually work
print qdict.urlencode()

最後から2番目の行を機能させるにはどうすればよいですか?

4

5 に答える 5

77

どうですか?

from django.http import QueryDict

ordinary_dict = {'a': 'one', 'b': 'two', }
query_dict = QueryDict('', mutable=True)
query_dict.update(ordinary_dict)
于 2012-11-13T15:34:11.123 に答える
23

Pythonには、辞書(任意のマッピングオブジェクト)をクエリ文字列にエンコードするための組み込みツールがあります

params = {'a': 'one', 'b': 'two', }

urllib.urlencode(params)

'a=one&b=two'

http://docs.python.org/2/library/urllib.html#urllib.urlencode

QueryDictコンストラクタの最初のパラメータとしてクエリ文字列を取ります

def __init__(self, query_string, mutable=False, encoding=None):

q = QueryDict('a=1&b=2')

https://github.com/django/django/blob/master/django/http/request.py#L260

更新:Python3では、urlencodeがurllib.parseに移動しました

from urllib.parse import urlencode

params = {'a': 'one', 'b': 'two', }
urlencode(params)
'a=one&b=two'
于 2012-11-13T15:34:28.020 に答える
13

実際には、これを実現するための少し間接的ですが、より論理的な方法は、MultiValueDictを使用することです。このようにして、キーごとに複数の値をQueryDictに格納でき、.getlistメソッドが正常に機能するはずです。

from django.http.request import QueryDict, MultiValueDict
dictionary = {'my_age': ['23'], 'my_girlfriend_age': ['25', '27'], }

qdict = QueryDict('', mutable=True)
qdict.update(MultiValueDict(dictionary))

print qdict.get('my_age')  # 23
print qdict['my_girlfriend_age']  # 27
print qdict.getlist('my_girlfriend_age')  # ['25', '27']
于 2015-07-01T16:11:18.350 に答える
5

私のソリューションは、単一のキー値と複数のキー値の両方で機能します。

def dict_to_querydict(dictionary):
    from django.http import QueryDict
    from django.utils.datastructures import MultiValueDict

    qdict = QueryDict('', mutable=True)

    for key, value in dictionary.items():
        d = {key: value}
        qdict.update(MultiValueDict(d) if isinstance(value, list) else d)

    return qdict
于 2018-07-19T13:18:14.393 に答える
0

パーティーにこれ以上遅れることはありませんでしたが、最近同じことをする必要がありましたが、応答オブジェクトからの「実際の」QueryDictの読み取り専用の動作を維持する必要がありました。

メソッドからのコードを適応させるとQueryDict.fromkeys()、素晴らしい機能が得られました。

from django.http import QueryDict

def querydict_from_dict(data: Dict[str, Any],  mutable=False) -> QueryDict:
    """
    Return a new QueryDict with keys (may be repeated) from an iterable and
    values from value.
    """
    q = QueryDict('', mutable=True)

    for key in data:
        q.appendlist(key, data[key])

    if not mutable:
        q._mutable = False

    return q
于 2021-10-26T22:45:53.663 に答える