Python - 向QueryDict开头添加元素 - 保持顺序以转换为查询字符串
我正在尝试在一个QueryDict的开头添加内容,并保持这些项目的顺序(因为最终需要把它编码成一个特定顺序的查询字符串)。我知道QueryDict是不可变的,所以必须先进行.copy(),但我似乎无法添加值。从我的日志中可以看出,QueryDict并没有改变。谢谢你们给出的任何提示。
这是我的Python代码:
if self.request.POST:
params = self.request.POST.copy()
logging.info('params response back: %s' % params)
if params:
params['cmd']='_notify-validate'
logging.info('just added cmd: %s' % params)
params = urllib.urlencode(params)
logging.info('converted response back: %s' % params)
这是我的日志:
2014-07-03 10:58:36.460 params response back: UnicodeMultiDict([('residence_country', u'US'), ('invoice', u'abc1234'), ('address_city', u'San Jose'), ('first_name', u'John'),
2014-07-03 10:58:36.461 just added cmd: UnicodeMultiDict([('residence_country', u'US'), ('invoice', u'abc1234'), ('address_city', u'San Jose'), ('first_name', u'John'), ('pay
2014-07-03 10:58:36.462 converted response back: residence_country=US&invoice=abc1234&address_city=San+Jose&first_name=John&payer_id=TESTBUYERID01&mc_fee=0.44&txn_id=53760294
2 个回答
2
QueryDict 是从 Django 的 MultiValueDict 继承而来的,而 MultiValueDict 又是从 Python 的字典(dict)继承的。Python 的字典是用哈希表来实现的,所以我们不能保证字典里的顺序会一直保持不变。
不过,你可以把键(keys)单独放到一个列表里,这样就能保持它们的顺序,同时也能节省一些空间。
0
我觉得你可以用(name, value)这样的成对元组来确保顺序,而不是用字典(因为字典本身是不能保证顺序的,实际上是没有顺序的)。
params = urllib.urlencode([("param1","val1"),("param2","val2"),...])
这样可以保证参数的顺序。