Django の QueryDict の挙動でちょっとこんがらがってしまったのでメモ書き。
Django の QueryDict は単純に update
した場合。
キーが被るものに関しては通常の dict 形式の様に上書き更新するのではなく、値のリストに追加される仕様。ということで以下の様な挙動になる。
>>> sample_dict = QueryDict('aaa=xxx&bbb=yyy', mutable=True)
>>> sample_dict
<QueryDict: {u'aaa': [u'xxx'], u'bbb': [u'yyy']}>
>>> sample_dict.update({'aaa':'AAA'})
>>> sample_dict
<QueryDict: {u'aaa': [u'xxx', 'AAA'], u'bbb': [u'yyy']}>
get
で単純にキーを指定して値を出す場合は最新の値を一つだけ出してくれるのでいいのだけど
この状態で urlencode
すると全部の情報が出てきてしまう。
>>> sample_dict.get('aaa')
'AAA'
>>> sample_dict.urlencode()
u'aaa=xxx&aaa=AAA&bbb=yyy'
重複せず最新のものを採用して urlencode
してほしかったので一旦 dict で処理して回避した。
(けどもっとうまい方法無いかな...)
>>> current_queries = QueryDict('aaa=xxx&bbb=yyy').dict()
>>> current_queries
{'aaa': 'xxx', 'bbb': 'yyy'}
>>> add_queries = { 'aaa': 'AAA' }
>>> add_queries
{'aaa': 'AAA'}
>>> current_queries.update(add_queries)
>>> current_queries
{'aaa': 'AAA', 'bbb': 'yyy'}
>>> query_dictionary = QueryDict('', mutable=True)
>>> query_dictionary
<QueryDict: {}>
>>> query_dictionary.update(current_queries)
>>> query_dictionary
<QueryDict: {'aaa': ['AAA'], 'bbb': ['yyy']}>
>>> query_dictionary.urlencode()
'aaa=AAA&bbb=yyy'