Ответ 1
Как насчет?
from django.http import QueryDict
ordinary_dict = {'a': 'one', 'b': 'two', }
query_dict = QueryDict('', mutable=True)
query_dict.update(ordinary_dict)
Представьте, что у меня есть словарь в приложении Django:
dict = {'a': 'one', 'b': 'two', }
Теперь я хочу легко создать список параметров GET с urlencoded из этого словаря. Конечно, я мог бы прокручивать словарь, ключи и значения urlencode, а затем объединять строку самостоятельно, но должен быть более простой способ. Я хотел бы использовать экземпляр QueryDict. QueryDict является подклассом dict, поэтому это должно быть возможно как-то.
qdict = QueryDict(dict) # this does not actually work
print qdict.urlencode()
Как сделать вторую работу последней строки?
Как насчет?
from django.http import QueryDict
ordinary_dict = {'a': 'one', 'b': 'two', }
query_dict = QueryDict('', mutable=True)
query_dict.update(ordinary_dict)
В Python есть встроенный инструмент для кодирования словаря (любого отображаемого объекта) в строку запроса
params = {'a': 'one', 'b': 'two', }
urllib.urlencode(params)
'a=one&b=two'
http://docs.python.org/2/library/urllib.html#urllib.urlencode
QueryDict
принимает строку запроса в качестве первого параметра своего consttructor
def __init__(self, query_string, mutable=False, encoding=None):
q = QueryDict('a=1&b=2')
https://github.com/django/django/blob/master/django/http/request.py#L260
Обновление: в Python3 urlencode перемещен в urllib.parse:
from urllib.parse import urlencode
params = {'a': 'one', 'b': 'two', }
urlencode(params)
'a=one&b=two'
На самом деле немного косвенным, но более логичным способом достижения этого является использование MultiValueDict. Таким образом, несколько значений на ключ могут быть сохранены в QueryDict, а метод .getlist должен работать нормально.
from django.http.request import QueryDict, MultiValueDict
dictionary = {'my_age': ['23'], 'my_girlfriend_age': ['25', '27'], }
qdict = QueryDict('', mutable=True)
qdict.update(MultiValueDict(dictionary))
print qdict.get('my_age') # 23
print qdict['my_girlfriend_age'] # 27
print qdict.getlist('my_girlfriend_age') # ['25', '27']
Мое решение работает как для одного, так и для нескольких значений ключа:
def dict_to_querydict(dictionary):
from django.http import QueryDict
from django.utils.datastructures import MultiValueDict
qdict = QueryDict('', mutable=True)
for key, value in dictionary.items():
d = {key: value}
qdict.update(MultiValueDict(d) if isinstance(value, list) else d)
return qdict