QueryDict:本身继承dict,特性就是跟列表的一些属性封装起来了
初始化方法(__init__()):
def __init__(self, query_string=None, mutable=False, encoding=None):
super(QueryDict, self).__init__()
if not encoding:
encoding = settings.DEFAULT_CHARSET
self.encoding = encoding
query_string = query_string or ''
parse_qsl_kwargs = {
'keep_blank_values': True,
'fields_limit': settings.DATA_UPLOAD_MAX_NUMBER_FIELDS,
'encoding': encoding,
}
if six.PY3:
if isinstance(query_string, bytes):
# query_string normally contains URL-encoded data, a subset of ASCII.
try:
query_string = query_string.decode(encoding)
except UnicodeDecodeError:
# ... but some user agents are misbehaving :-(
query_string = query_string.decode('iso-8859-1')
for key, value in limited_parse_qsl(query_string, **parse_qsl_kwargs):
self.appendlist(key, value)
else:
for key, value in limited_parse_qsl(query_string, **parse_qsl_kwargs):
try:
value = value.decode(encoding)
except UnicodeDecodeError:
value = value.decode('iso-8859-1')
self.appendlist(force_text(key, encoding, errors='replace'),
value)
self._mutable = mutable
参数:
- query_string=None:创建QueryDict对象时,如果传了一个QueryDict(字符串),会有两种特殊情况:
# 1.有&的符的情况,把&前后两个值当做key
q = QueryDict('query&8',mutable=True)
# 结果:
<QueryDict: {'query': [''], '8': ['']}>
# 2.中间有'='的时候,会把等号左右的值,做key和value:
q = QueryDict('query=8&next=/9',mutable=True)
print(q)
# 输出:
<QueryDict: {'query': ['8'], 'next': ['/9']}>
- mutable=True:(英文:易变的)
-
_mutable = True _encoding = None def __init__(self, query_string=None, mutable=False, encoding=None): self._mutable = mutable ''' 这是django的源码,_mutable本身是True,这个属性是当你定义一个QueryDict对象, 你可以对它做修改; 但是初始化中,可以看到mutable默认值为False,然后又重新赋值给了_mutable, 所以你要想对QueryDict对象做增删改时,就将它设为True; '''
在web开发中用的一个方法:
- QueryDict().urlencode:
-
''' q.urlencode()会把你对象中的所有key和value用=拼接起来 然后值与值之间用&连接 ''' q = QueryDict(mutable=True) q['query'] = '8' q['page'] = 2 print(q.urlencode()) # 结果 query=8&page=2
''' QueryDict会对你的特殊符号进行转义; 所以可以利用这个,在web开发,获取当前的路径,传给你要跳转的页面 ''' q = QueryDict(mutable=True) q['next'] = '/crm/customer/?query=8&page=2' print(q.urlencode()) # 结果: next=%2Fcrm%2Fcustomer%2F%3Fquery%3D8%26page%3D2
字典排序的四种方法
dic = {'a': 10, 'e': 5, 'r': 7, 'p': 3}
# 第一种解法
print(dict(map(lambda x: (x, dic[x]), sorted(dic, key=lambda x: dic[x]))))
# 第二种解法
print(dict(sorted(dic.items(), key=lambda x: x[1])))
# 第三种解法
import operator
print(dict(sorted(dic.items(),key=operator.itemgetter(1))))
# 第四种解法
f = zip(dic.keys(),dic.values())
print(dict(sorted(f,key=lambda x:x[1])))
# 知识点:
# 元祖或列表强转字典,dict接收可迭代对象,可迭代对象里面包含元祖或列表,里面有两个元素
print(dict( [ ('k1', 1), ('k2',2) ] ))