Django:我可以从字典创建QueryDict吗?

win*_*ith 33 python django

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

dict = {'a': 'one', 'b': 'two', }
Run Code Online (Sandbox Code Playgroud)

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

qdict = QueryDict(dict) # this does not actually work
print qdict.urlencode()
Run Code Online (Sandbox Code Playgroud)

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

mik*_*725 55

怎么样?

from django.http import QueryDict

ordinary_dict = {'a': 'one', 'b': 'two', }
query_dict = QueryDict('', mutable=True)
query_dict.update(ordinary_dict)
Run Code Online (Sandbox Code Playgroud)

  • 您可以立即创建一个可变的QueryDict而不是复制:`QueryDict('',mutable = True)` (7认同)
  • 此选项不适用于列表字典。请参阅@Arpit Singh 的回答。 (3认同)

dm0*_*514 19

Python有一个内置工具,用于将字典(任何映射对象)编码为查询字符串

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

urllib.urlencode(params)

'a=one&b=two'
Run Code Online (Sandbox Code Playgroud)

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

QueryDict 将查询字符串作为其contstructor的第一个参数

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


Arp*_*ngh 7

实际上,使用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']
Run Code Online (Sandbox Code Playgroud)

  • 嗯.. 与其他只处理单个值的方法不同,这个需要值是列表(它将字符串分解为字符列表)。似乎没有简单的方法来处理两者。 (2认同)

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