我想在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之间有什么区别?
答案 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具有不可变的附加属性。这是主要的不同点。