Django QueryDict 對象

在 HttpRequest 對象中,GET 和 POST 屬性得到的都是 django.http.QueryDict 所創(chuàng)建的實(shí)例。這是一個 django 自定義的類似字典的類,用來處理同一個鍵帶多個值的情況。

在 python 原始字典中,當(dāng)一個鍵出現(xiàn)多個值的時候會發(fā)生沖突,只保留最后一個值。而在 HTTL 表單中,通常會發(fā)生一個鍵有多個值的情況,例如 <select multiple> (多選框)就是一個很常見的情況。

request.POST 和 request.GET 的 QueryDict 在一個正常的請求/響應(yīng)過程中是不可變的。 若要獲得可變的版本,需要使用 copy() 方法。

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

這是一個構(gòu)造函數(shù),其中 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 沒有傳入,則獲得一個空的對象。
如果你想自己實(shí)例化一個對象,可以傳遞 mutable=True 使你所實(shí)例化的對象可變。當(dāng)然 request.POST 和 request.GET 是 django 所創(chuàng)建的,也就是說除非改 django 源碼,否則它們是不可變的。
對于設(shè)置的鍵和值,會從 encoding 轉(zhuǎn)碼成 Unicode。也就是說,如果傳入的字符串 query_string 是 GBK 或者是 utf-8 的編碼,將會自動轉(zhuǎn)碼成 Unicode,然后用做字典的鍵和值。如果 encoding = None,也就是沒有設(shè)定的話,將使用 DEFAULT_CHARSET 的值,默認(rèn)為:utf-8。

getitem
QueryDict.__getitem__(key)

返回給定的 key 的值。 如果 key 具有多個值,則返回 最后 (最新)的值。如果 key 不存在,則引發(fā) django.utils.datastructures.MultiValueDictKeyError 。(它是Python 標(biāo)準(zhǔn) KeyError 的一個子類,所以你仍然可以堅持捕獲 KeyError)

setitem
QueryDict. __setitem__(key, value)

設(shè)置給定的 key 的值為 [value] (一個Python 列表,只有一個元素 value)。注意:只有對象是可以改變的時候才能使用,例如通過 copy() 方法創(chuàng)建的對象。

contains
QueryDict.__contains__(key)

如果 key 已經(jīng)設(shè)置,則返回 True。 它讓你可以做 if foo in request.GET 這樣的操作。

get
QueryDict.get(key, default)

使用與上面 __getitem__()相同的邏輯,當(dāng) key 不存在時返回一個默認(rèn)值。

setdefault
QueryDict.setdefault(key, default)

類似標(biāo)準(zhǔn)字典的 setdefault() 方法,只是它在內(nèi)部使用的是 __setitem__
。也就是說,當(dāng) key 已經(jīng)存在時,返回其值,key 不存在時,返回 default,同時添加 key 和 default 到對象中。

update
QueryDict.update(other_dict)

接收一個 QueryDict 或標(biāo)準(zhǔn)字典。 類似標(biāo)準(zhǔn)字典的 update() 方法,但是它附加到當(dāng)前字典項的后面,而不是替換掉它們。

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

類似標(biāo)準(zhǔn)字典的 items() 方法,返回一個由鍵值組成的元組的列表。但是它使用的是和 __getitem__ 一樣返回最新的值的邏輯。

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

類似標(biāo)準(zhǔn)字典的 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()

類似標(biāo)準(zhǔn)字典的 values() 方法,但是它使用的是和 __getitem__ 一樣返回最新的值的邏輯。也就是返回一個所有鍵對應(yīng)的最新值的列表。

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

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

copy
QueryDict.copy()

返回對象的副本,使用 Python 標(biāo)準(zhǔn)庫中的 copy.deepcopy()。此副本是可變的即使原始對象是不可變的。

getlist
QueryDict.getlist(key, default)

以 Python 列表形式返回所請求的鍵的數(shù)據(jù)。 如果鍵不存在并且沒有提供默認(rèn)值,則返回空列表。

setlist
QueryDict.setlist(key, list_)

為給定的鍵設(shè)置 list_(與 setitem() 不同),可以設(shè)置一個多元素的列表。

appendlist
QueryDict.appendlist(key, item)

將項追加到內(nèi)部與鍵相關(guān)聯(lián)的列表中。

lists
QueryDict.lists()

類似 items,返回的列表中的每個元素,都是由鍵和對應(yīng)的值列表組成的二元元組。

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

返回給定鍵的值的 列表 ,并從字典中移除它們。如果鍵不存在,將引發(fā) KeyError。

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

刪除字典 任意 一個成員(因?yàn)闆]有順序的概念),并返回二值元組,包含鍵和鍵的所有值的列表。 在一個空的字典上調(diào)用時將引發(fā) 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])

從數(shù)據(jù)中返回查詢字符串格式。

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

可選地,urlencode 可以傳遞不需要編碼的字符。(這意味著要進(jìn)行 url 編碼)

>>> q = QueryDict(mutable=True)
>>> q['next'] = '/a&b/'
>>> q.urlencode()
u'next=%2Fa%26b%2F'
>>> q.urlencode(safe='/')
u'next=/a%26b/'
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容