首页 文章

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

提问于
浏览
27

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

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

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

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

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

4 回答

  • 1

    怎么样?

    from django.http import QueryDict
    dict = {'a': 'one', 'b': 'two', }
    qdict = QueryDict('', mutable=True)
    qdict.update(dict)
    
  • 6

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

    params = {'a': 'one', 'b': 'two', }
    
    urllib.urlencode(params)
    
    'a=one&b=two'
    

    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有moved to urllib.parse

    from urllib.parse import urlencode
    
    params = {'a': 'one', 'b': 'two', }
    urlencode(params)
    'a=one&b=two'
    
  • 17

    实际上,使用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']
    
  • 44

    我的解决方案适用于单个和多个键值:

    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
    

相关问题