Python 我可以叫Django QueryDict吗?

Python 我可以叫Django QueryDict吗?,python,django,http,query-string,Python,Django,Http,Query String,可以让Django的QueryDict保留原始查询字符串的顺序吗 >>> from django.http import QueryDict >>> q = QueryDict(u'x=foo³&y=bar(potato),z=hello world') >>> q.urlencode(safe='()') u'y=bar(potato)%2Cz%3Dhello%20world&x=foo%C2%B3' 继承自Django的

可以让Django的QueryDict保留原始查询字符串的顺序吗

>>> from django.http import QueryDict
>>> q = QueryDict(u'x=foo³&y=bar(potato),z=hello world')
>>> q.urlencode(safe='()')
u'y=bar(potato)%2Cz%3Dhello%20world&x=foo%C2%B3'
继承自Django的,Django的继承自。因此,您不能保证它会保持有序

我不确定这是否与您的需求相关,但是。使用此功能,您可以执行以下操作:

>>> from django.http import QueryDict
>>> q = QueryDict(u'x=foo³&x=bar(potato),x=hello world')
>>> q.lists()
[('x', ['foo³', 'bar(potato)', 'hello world'])]
>>> q.urlencode(safe='()')
u'x=foo%C2%B3&x=bar(potato)&x=hello%20world'
类基于基于常规python
dict
,正如您所知,这是一个无序的集合

根据,
QueryDict
内部使用的方法,该方法保留查询参数的顺序,输出元组列表:

>>> from urlparse import parse_qsl
>>> parse_qsl('x=foo³&y=bar(potato),z=hello world')
[('x', 'foo\xc2\xb3'), ('y', 'bar(potato),z=hello world')]
您可以使用
parse_qsl()
给出的键顺序进行排序:

>>> order = [key for key, _ in parse_qsl('x=foo³&y=bar(potato),z=hello world')]
>>> order
['x', 'y']
然后,子类
QueryDict
并重写
lists()
中使用的
urlencode()方法

这种方法有点难看,可能需要进一步改进,但希望它至少能让你了解正在发生的事情以及你能做些什么

>>> class MyQueryDict(QueryDict):
...     def __init__(self, query_string, mutable=False, encoding=None, order=None):
...         super(MyQueryDict, self).__init__(query_string, mutable=False, encoding=None)
...         self.order = order
...     def lists(self):
...         return [(key, self.getlist(key)) for key in self.order]
... 
>>> q = MyQueryDict(u'x=foo³&y=bar(potato),z=hello world', order=order)
>>> q.urlencode(safe='()')
u'x=foo%C2%B3&y=bar(potato)%2Cz%3Dhello%20world'