django-QueryDict

摘要:
request.POST和request.GET的QueryDict在一个正常的请求/响应循环中是不可变的。你所遇到的QueryDict对象,特别是request.POST和request.GET得到的。如果key不存在,则引发django.utils.datastructures.MultiValueDictKeyError。也就是说,当key已经存在时,返回其值,key不存在时,返回default,同时添加key和default到对象中。
django-QueryDict 对象

HttpRequest对象中,属性 GET 和 POST 得到的都是django.http.QueryDict所创建的实例。这是一个 django 自定义的类似字典的类,用来处理同一个键带多个值的情况。

在 python 原始的字典中,当一个键出现多个值的时候会发生冲突,只保留最后一个值。而在 HTML 表单中,通常会发生一个键有多个值的情况,例如<selectmultiple>(多选框)就是一个很常见情况。

request.POSTrequest.GETQueryDict在一个正常的请求/响应循环中是不可变的。若要获得可变的版本,需要使用.copy()方法。

下面我们来看这个类中有什么方法:

1.QueryDict.__init__(query_string=None,mutable=False,encoding=None)

这是一个构造函数,其中query_string 需要一个字符串,例如:

>>> QueryDict('a=1&a=2&c=3')
<QueryDict: {'a': ['1', '2'], 'c': ['3']}>

如果query_string 没有传入,则获得一个空的对象。

你所遇到的QueryDict 对象,特别是request.POST 和request.GET 得到的。如果你想自己实例化一个对象,可以传递mutable=True 使你所实例化的对象可变。当然request.POST 和request.GET 是django创建的,也就是说除非改 django 源码,否则它们是不可变的。

对于设置的键和值,会从 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。)

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()

返回QueryDictdict表示形式。对于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/'

免责声明:文章转载自《django-QueryDict》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Akka源码分析-Remote-Actor创建qt调用仪器驱动库dll实现程控下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

从今天开始看《Redis深度历险》--位图

网页版redis并不支持bitfield这个指令 位图这一概念让我想起来一个算法问题,在N亿个数字中判断某个数是否存在,感兴趣的可以去看一下。 看过上面的问题之后我相信对书中的零存整取、整存零取概念就会理解了,书中的例子是将hello字符串转换为ASCII码进行零存整取、整存零取。   相关指令   setbit key value 按位存   getbi...

jquery动态实现填充下拉框

 当点下拉框时动态加载后台数据。 后台代码 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("UTF-8...

原来zabbix监控进程与端口是如此的简单!

使用zabbix自带key监控进程与端口 每个公司都有自己的程序,自己的进程名与端口监听,对于nagios来说,这些都经常需要自己去写插件,但是zabbix不需要,它自己就有监控进程与端口的key。 在使用zabbix的key来监控进程与端口前,我也自己写了插件,但用起来很不爽,因为需要在所有agent上都要进行配置与维护。如果用zabbix自带的功能,只...

ASP.NET SignalR 与 LayIM2.0 配合轻松实现Web聊天室(十二) 代码重构使用反射工厂解耦(一)缓存切换

前言   上一篇中,我们用了反射工厂来解除BLL和UI层耦合的问题。当然那是最简单的解决方法,再复杂一点的程序可能思路相同,但是在编程细节中需要考虑的就更多了,比如今天我在重构过程中遇到的问题。也是接下来我要解决的问题,缓存模块。为什么要解决这个问题呢,由于我们有些下载代码运行的小伙伴,发现怎么运行报错,原来是没有装redis。可是我只想看layim和si...

线上redis热key问题

一个安静的晚上突然被群里报警打断,然后果断不情愿的爬起来找问题,通过监控发现一个服务的QPS暴增,接口响应延迟也上来了,达到s级别了,所以赶紧找问题。 因为应用很依赖redis,第一时间先看是不是它,果然还真是它,看下图: 确定了问题的方向就该找具体原因了,进一步查看Zabbix发现其中一台redis的CPU使用率明显升高,如下图: 连到机器上top发...

vue_相同组件,不同url跳转不重新渲染的解决方法

最近写的这个项目,有很多下拉菜单,每个菜单会有相应的两种类型。现在产品的需求是,跳转到不同的类型 需要页面重新渲染数据 那么问题来了。 我试了好几种方法,用watch监听路由去判断,但是发现输在input里面的值是不会被替换掉的 所以想到了用key 去如果不使用key,Vue会使用一种最大限度减少动态元素并且尽可能的尝试修复/再利用相同类型元素的算法。使用...