Django QueryDict 对象

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

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

request.POST 和 request.GET 的 QueryDict 在一个正常的请求/响应过程中是不可变的。 若要获得可变的版本,需要使用 copy() 方法。

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

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

>>> from django.http import QueryDict
>>> QueryDict('a=1&a=2&b=1')
<QueryDict: {u'a': [u'1', u'2'], u'b': [u'1']}>

如果 query_string 没有传入,则获得一个空的对象。
如果你想自己实例化一个对象,可以传递 mutable=True 使你所实例化的对象可变。当然 request.POST 和 request.GET 是 django 所创建的,也就是说除非改 django 源码,否则它们是不可变的。
对于设置的键和值,会从 encoding 转码成 Unicode。也就是说,如果传入的字符串 query_string 是 GBK 或者是 utf-8 的编码,将会自动转码成 Unicode,然后用做字典的键和值。如果 encoding = None,也就是没有设定的话,将使用 DEFAULT_CHARSET 的值,默认为:utf-8。

getitem
QueryDict.__getitem__(key)

返回给定的 key 的值。 如果 key 具有多个值,则返回 最后 (最新)的值。如果 key 不存在,则引发 django.utils.datastructures.MultiValueDictKeyError 。(它是Python 标准 KeyError 的一个子类,所以你仍然可以坚持捕获 KeyError)

setitem
QueryDict. __setitem__(key, value)

设置给定的 key 的值为 [value] (一个Python 列表,只有一个元素 value)。注意:只有对象是可以改变的时候才能使用,例如通过 copy() 方法创建的对象。

contains
QueryDict.__contains__(key)

如果 key 已经设置,则返回 True。 它让你可以做 if foo in request.GET 这样的操作。

get
QueryDict.get(key, default)

使用与上面 __getitem__()相同的逻辑,当 key 不存在时返回一个默认值。

setdefault
QueryDict.setdefault(key, default)

类似标准字典的 setdefault() 方法,只是它在内部使用的是 __setitem__
。也就是说,当 key 已经存在时,返回其值,key 不存在时,返回 default,同时添加 key 和 default 到对象中。

update
QueryDict.update(other_dict)

接收一个 QueryDict 或标准字典。 类似标准字典的 update() 方法,但是它附加到当前字典项的后面,而不是替换掉它们。

>>> q = QueryDict('a=1', mutable=True)  # 要可变的才能使用
>>> q.update({'a': '2'})
>>> q
<QueryDict: {u'a': [u'1', '2']}>
>>> q.getlist('a')
[u'1', '2']
>>> q['a']  # returns the last
'2'
items
QueryDict.items()

类似标准字典的 items() 方法,返回一个由键值组成的元组的列表。但是它使用的是和 __getitem__ 一样返回最新的值的逻辑。

>>> q = QueryDict('a=1&a=2&a=3')
>>> q.items()
[(u'a', u'3')]
iteritems

类似标准字典的 iteritems() 方法,返回一个迭代对象。 类似 QueryDict.items(),使用的是和 __getitem__ 一样的返回最新的值的逻辑。

>>> q = QueryDict('a=1&a=2&a=3')
>>> q.iteritems()
<generator object _iteritems at 0x00000000044F04C8>
iterlists
QueryDict.iterlists()

类似 QueryDict.iteritems(),返回一个包含键值对的元祖(key, value)迭代对象,value 是一个包括所有 key 的值的列表。

values
QueryDict.values()

类似标准字典的 values() 方法,但是它使用的是和 __getitem__ 一样返回最新的值的逻辑。也就是返回一个所有键对应的最新值的列表。

>>> q = QueryDict('a=1&a=2&a=3')
>>> q.values()
[u'3']
itervalues
QueryDict.itervalues()

类似 QueryDict.values() ,只是它返回的是一个迭代器。

copy
QueryDict.copy()

返回对象的副本,使用 Python 标准库中的 copy.deepcopy()。此副本是可变的即使原始对象是不可变的。

getlist
QueryDict.getlist(key, default)

以 Python 列表形式返回所请求的键的数据。 如果键不存在并且没有提供默认值,则返回空列表。

setlist
QueryDict.setlist(key, list_)

为给定的键设置 list_(与 setitem() 不同),可以设置一个多元素的列表。

appendlist
QueryDict.appendlist(key, item)

将项追加到内部与键相关联的列表中。

lists
QueryDict.lists()

类似 items,返回的列表中的每个元素,都是由键和对应的值列表组成的二元元组。

>>> q = QueryDict('a=1&a=2&a=3')
>>> q.lists()
[(u'a', [1, 2, 3])]
pop
QueryDict.pop(key)

返回给定键的值的 列表 ,并从字典中移除它们。如果键不存在,将引发 KeyError。

>>> q = QueryDict('a=1&a=2&a=3', mutable=True)
>>> q.pop('a')
[u'1', u'2', u'3']
popitem
QueryDict.popitem()

删除字典 任意 一个成员(因为没有顺序的概念),并返回二值元组,包含键和键的所有值的列表。 在一个空的字典上调用时将引发 KeyError。

>>> q = QueryDict('a=1&a=2&b=3', mutable=True)
>>> q.popitem()
(u'a', [u'1', u'2'])
>>> q
<QueryDict: {u'b': [u'3']}>
dict
QueryDict.dict()

返回 QueryDict 的 dict 表示形式。

>>> q = QueryDict('a=1&a=2&b=3')
>>> q.dict()
{u'a': u'2', u'b': u'3'}
urlencode
QueryDict.urlencode([safe])

从数据中返回查询字符串格式。

>>> q = QueryDict('a=1&a=2&b=3')
q.urlencode()
u'a=1&a=2&b=3'

可选地,urlencode 可以传递不需要编码的字符。(这意味着要进行 url 编码)

>>> q = QueryDict(mutable=True)
>>> q['next'] = '/a&b/'
>>> q.urlencode()
u'next=%2Fa%26b%2F'
>>> q.urlencode(safe='/')
u'next=/a%26b/'
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,254评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,875评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,682评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,896评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,015评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,152评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,208评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,962评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,388评论 1 304
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,700评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,867评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,551评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,186评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,901评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,142评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,689评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,757评论 2 351

推荐阅读更多精彩内容