45

想象一下,我的 Django 应用程序中有一本字典:

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

现在我想轻松地从这个字典中创建一个 GET 参数的 urlencoded 列表。当然,我可以循环遍历字典、urlencode 键和值,然后自己连接字符串,但必须有更简单的方法。我想使用一个 QueryDict 实例。QueryDict 是 dict 的子类,所以它应该是可能的。

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

我将如何使倒数第二行工作?

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 回答