【问题标题】:Django: Can I create a QueryDict from a dictionary?Django:我可以从字典中创建一个 QueryDict 吗?
【发布时间】:2012-11-13 15:31:14
【问题描述】:

假设我的 Django 应用程序中有一本字典:

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

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

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

如何使倒数第二行工作?

【问题讨论】:

    标签: python django


    【解决方案1】:

    怎么样?

    from django.http import QueryDict
    
    ordinary_dict = {'a': 'one', 'b': 'two', }
    query_dict = QueryDict('', mutable=True)
    query_dict.update(ordinary_dict)
    

    【讨论】:

    • 应该是qdict = QueryDict(''),然后这确实有效。谢谢。
    • 谢谢。不知道其他方法。酷。
    • 您可以直接创建一个可变 QueryDict,而不是复制:QueryDict('', mutable=True)
    • 此选项不适用于列表字典。请参阅@Arpit Singh 的答案。
    【解决方案2】:

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

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

    【讨论】:

    • m) 事后看来是如此明显。
    • 您的答案是我想要的,但不是问题的确切答案。您是否介意接受另一个答案,但创建一个新问题,您可以在其中再次发布此答案?
    • 这行得通,但往返效率很低!
    【解决方案3】:

    实际上,实现这一点的一种间接但更合乎逻辑的方法是使用 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']
    

    【讨论】:

    • Hm.. 与其他仅处理单个值的方法不同,这个要求值是列表(它将字符串分解为字符列表)。似乎没有简单的方法来处理两者。
    【解决方案4】:

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

    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
    

    【讨论】:

      【解决方案5】:

      我不能再迟到了,但我最近需要做同样的事情 - 但要保留响应对象中“真实”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
      

      【讨论】:

        猜你喜欢
        • 2016-10-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-11-14
        • 1970-01-01
        • 2014-08-26
        • 1970-01-01
        • 2010-10-13
        相关资源
        最近更新 更多