我正在尝试添加到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
答案 0 :(得分:2)
QueryDict继承自Django的MultiValueDict,它继承自Python的dict,它是作为哈希表实现的。因此,您无法保证它会保持有序。
但是您可以做的是仅将键添加到列表中以保留该顺序(同时最小化空间)。
答案 1 :(得分:0)
我认为您可以使用(名称,值)对元组来确保订单而不是dict(根据定义,它不能保证任何订单,实际上没有订单)
params = urllib.urlencode([("param1","val1"),("param2","val2"),...])
这将保证params的顺序