Python - 向QueryDict开头添加元素 - 保持顺序以转换为查询字符串

0 投票
2 回答
783 浏览
提问于 2025-04-18 12:02

我正在尝试在一个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"),...])

这样可以保证参数的顺序。

撰写回答