Archive

Django の QueryDict で dict 型みたいに更新した状態で urlencode するメモ

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'

参考: