QueryDict和MultiValueDict有什么区别?

时间:2015-08-10 05:02:58

标签: python django dictionary

我想在django项目中将dict转换为QueryDict。存在一对链接来解释这一点(Django: Can I create a QueryDict from a dictionary?How to change a django QueryDict to Python Dict?)。这是我想要转换abc = {'a': 1, 'b':[1,2,3]}的简单字典。我尝试过这种方法:

from django.http import QueryDict
from django.utils.datastructures import MultiValueDict
abc = { 'a': 1, 'b':[1,2,3]}
mdict = MultiValueDict(abc)
qdict = QueryDict(mdict)

这是我得到的错误跟踪

/usr/lib/python2.7/urlparse.pyc in parse_qsl(qs, keep_blank_values, strict_parsing)
407     Returns a list, as G-d intended.
408     """
409     pairs = [s2 for s1 in qs.split('&') for s2 in s1.split(';')]
410     r = []
411     for name_value in pairs:
AttributeError: 'MultiValueDict' object has no attribute 'split'

为什么会失败,我该如何完成? MultiValueDict和QueryDict之间有什么区别?

3 个答案:

答案 0 :(得分:3)

QueryDict是一个MultiValueDict的专用类,它们之间唯一的主要区别是,QueryDict默认是不可变的。

引用QueryDict文档字符串: -

  

表示查询字符串的专用MultiValueDict。 QueryDict可用于表示GET或POST数据。它是子类       MultiValueDict,因为例如可以重复这些数据中的键       来自带有字段的表单的数据。       默认情况下,QueryDicts是不可变的,尽管是copy()方法       将永远返回一个可变副本。

您可以参考代码本身 - QueryDict code

就多值字典的查询字典初始化而言,QueryDict不允许传递{{1}}中的任何字符串。我猜,这是他们的疏忽。

答案 1 :(得分:3)

MultiValueDict是一个字典子类,可以处理分配给键的多个值。因此,您应该将values dict作为list传递。在这里,1->[1]

  

在HttpRequest对象中,GET和POST属性是django.http.QueryDict的实例,这是一个类似字典的类,用于处理同一个键的多个值。这是必要的,因为一些HTML表单元素,特别是为同一个键传递多个值。

     

在request.POST和request.GET中的QueryDicts在正常的请求/响应周期中访问时将是不可变的。要获得可变版本,您需要使用.copy()。

然后MultiValueDict可以转换为QueryDict

abc = { 'a': [1], 'b':[1,2,3]}
mdict = MultiValueDict(abc)
qdict = QueryDict('', mutable=True)
qdict.update(mdict)
>>>QueryDict: {u'a': [1], u'b': [1, 2, 3]}>
>>>dict(qdict.iterlists())
{u'a': [1], u'b': [1, 2, 3]}
>>>qdict.getlist('b')
[1, 2, 3]

答案 2 :(得分:1)

从django.http.request.QueryDict:

的定义
  

“””       一个专门的MultiValueDict,表示查询字符串。       QueryDict可用于表示GET或POST数据。它是子类       MultiValueDict,因为例如可以重复这些数据中的键       来自带有字段的表单的数据。       默认情况下,QueryDicts是不可变的,尽管是copy()方法       将永远返回一个可变副本。       此类上设置的键和值都是从给定的编码转换而来的       (默认情况下为DEFAULT_CHARSET)为unicode。       “”“

从django.utils.datastructures.MultiValueDict的定义:

  

“””       自定义的字典的子类,用于处理多个值       同样的关键。

     
    
      
        

d = MultiValueDict({'name':['Adrian','Simon'],'position':['Developer']})         d [ '名称']             “西蒙”         d.getlist( '名称')             ['阿德里安','西蒙']         d.getlist( 'doesnotexist')             []         d.getlist('doesnotexist',['Adrian','Simon'])             ['阿德里安','西蒙']         d.get('lastname','不存在')             '不存在的'         d.setlist('lastname',['Holovaty','Willison'])             这个类的存在是为了解决cgi.parse_qs引发的恼人问题,             即使大多数Web表单都提交,它也会返回每个键的列表             单个名称 - 值对。             “”“

      
    
  

因此,作为子类MultiValueDict,QueryDict具有不可变的附加属性。这是主要的不同点。