Python--Django的QueryDict对象详细解析

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) ] ))
发布了23 篇原创文章 · 获赞 14 · 访问量 9万+

猜你喜欢

转载自blog.csdn.net/hgdl_sanren/article/details/83377828