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