在 HttpRequest 对象中,属性 GET 和 POST 获得的都是 django.http.QueryDict 所建立的实例。这是一个 django 自定义的相似字典的类,用来处理同一个键带多个值的状况。python
在 python 原始的字典中,当一个键出现多个值的时候会发生冲突,只保留最后一个值。而在 HTML 表单中,一般会发生一个键有多个值的状况,例如 <select multiple> (多选框)就是一个很常见状况。django
request.POST 和request.GET 的QueryDict 在一个正常的请求/响应循环中是不可变的。若要得到可变的版本,须要使用.copy()方法。app
下面咱们来看这个类中有什么方法:函数
1.QueryDict.__init__(query_string=None, mutable=False, encoding=None)编码
这是一个构造函数,其中 query_string 须要一个字符串,例如:url
>>> QueryDict('a=1&a=2&c=3') <QueryDict: {'a': ['1', '2'], 'c': ['3']}>
若是 query_string 没有传入,则得到一个空的对象。spa
你所遇到的 QueryDict 对象,特别是 request.POST 和 request.GET 获得的。若是你想本身实例化一个对象,能够传递 mutable=True 使你所实例化的对象可变。固然 request.POST 和 request.GET 是django建立的,也就是说除非改 django 源码,不然它们是不可变的。code
对于设置的键和值,会从 encoding 转码成 Unicode。也就是说,若是传入的字符串 query_string 是 GBK 或者是 utf-8 的编码,将会自动转码成 Unicode,而后用作字典的键和值。若是 encoding = None,也就是没有设定的话,将使用 DEFAULT_CHARSET 的值,默认为:'utf-8'。
对象
2.QueryDict.__getitem__(key)
返回给出的 key 的值。若是key 具备多个值,__getitem__() 返回最后(最新)的值。若是 key 不存在,则引起django.utils.datastructures.MultiValueDictKeyError。(它是Python 标准KeyError 的一个子类,因此你仍然能够坚持捕获KeyError。) blog
3.QueryDict.__setitem__(key, value)
设置给出的 key 的值为[value](一个Python 列表,只有一个元素 value)。注意:只有对象是能够改变的时候才能使用,例如经过 .copy() 方法建立的对象。
4.QueryDict.__contains__(key)
若是给出的key 已经设置,则返回True。它让你能够作 if "foo" in request.GET 这样的操做。
5.QueryDict.get(key, default)
使用与上面__getitem__() 相同的逻辑,可是当key 不存在时返回一个默认值。
6.QueryDict.setdefault(key, default)
相似标准字典的setdefault() 方法,只是它在内部使用的是__setitem__()。也就是说,当key已经存在时,返回其值,key不存在时,返回default,同时添加 key 和 default到对象中。
7.QueryDict.update(other_dict)
接收一个QueryDict 或标准字典。相似标准字典的update() 方法,可是它附加到当前字典项的后面,而不是替换掉它们。
例如:
>>> q = QueryDict('a=1', mutable=True) # 固然要可变的才能使用 >>> q.update({'a': '2'}) >>> q.getlist('a') ['1', '2'] >>> q['a'] # returns the last ['2']
8.QueryDict.items()
相似标准字典的items() 方法,返回一个由键值组成的元祖的列表。可是它使用的是和__getitem__ 同样返回最新的值的逻辑。
例如:
>>> q = QueryDict('a=1&a=2&a=3') >>> q.items() [('a', '3')]
9.QueryDict.iteritems()
相似标准字典的iteritems() 方法,返回一个迭代对象。相似 QueryDict.items(),它使用的是和QueryDict.__getitem__() 同样的返回最新的值的逻辑。
10.QueryDict.iterlists()
相似QueryDict.iteritems(),返回一个包含键值对的元祖(key, value)迭代对象 ,value 是一个包括全部 key 的值的列表。
11.QueryDict.values()
相似标准字典的values() 方法,可是它使用的是和__getitem__ 同样返回最新的值的逻辑。也就是返回一个全部键对应的最新值的列表。
例如:
>>> q = QueryDict('a=1&a=2&a=3') >>> q.values() ['3']
12.QueryDict.itervalues()
相似QueryDict.values(),只是它返回的是一个迭代器。
13.QueryDict.copy()
返回对象的副本,使用Python 标准库中的copy.deepcopy()。此副本是可变的即便原始对象是不可变的。
14.QueryDict.getlist(key, default)
以Python 列表形式返回所请求的键的数据。若是键不存在而且没有提供默认值,则返回空列表。它保证返回的是某种类型的列表,除非默认值不是列表。
15.QueryDict.setlist(key, list_)
为给定的键设置list_(与__setitem__() 不一样),能够设置一个多元素的列表。
16.QueryDict.appendlist(key, item)
将项追加到内部与键相关联的列表中。
17.QueryDict.setlistdefault(key, default_list)
相似setdefault,除了它接受一个列表而不是单个值。
18.QueryDict.lists()
相似items,只是它将字典中的每一个成员做为列表。也就是说,列表中的每一个元素,都是由键和对应的值列表组成的二元元祖。
例如:
>>> q = QueryDict('a=1&a=2&a=3') >>> q.lists() [('a', ['1', '2', '3'])]
19.QueryDict.pop(key)
返回给定键的值的列表,并从字典中移除它们。若是键不存在,将引起KeyError。
例如 ︰
>>> q = QueryDict('a=1&a=2&a=3', mutable=True) >>> q.pop('a') ['1', '2', '3']
20.QueryDict.popitem()
删除字典任意一个成员(由于没有顺序的概念),并返回二值元组,包含键和键的全部值的列表。在一个空的字典上调用时将引起KeyError。
例如 ︰
>>> q = QueryDict('a=1&a=2&a=3', mutable=True) >>> q.popitem() ('a', ['1', '2', '3'])
21.QueryDict.dict()
返回QueryDict 的dict 表示形式。对于QueryDict 中的每一个(key, list)对 ,dict 将有(key, item) 对,其中item 是列表中的一个元素,使用与QueryDict.__getitem__()相同的逻辑,也就是最新的:
>>> q = QueryDict('a=1&a=3&a=5') >>> q.dict() {'a': '5'}
22.QueryDict.urlencode([safe])
从数据中返回查询字符串格式。
例如:
>>> q = QueryDict('a=2&b=3&b=5') >>> q.urlencode() 'a=2&b=3&b=5'
可选地,urlencode 能够传递不须要编码的字符。(这意味着要进行 url 编码)
例如︰
>>> q = QueryDict(mutable=True) >>> q['next'] = '/a&b/' >>> q.urlencode(safe='/') 'next=/a%26b/'