Джанго: Могу ли я создать QueryDict из словаря?

Представьте, что у меня есть словарь в моем приложении Django:

dict = {'a': 'one', 'b': 'two', }

Теперь я хочу легко создать urlencoded список параметров GET из этого словаря. Конечно, я мог бы перебирать словарь, ключи и значения urlencode, а затем сам конкатенировать строку, но должен быть более простой способ. Я хотел бы использовать экземпляр QueryDict. QueryDict является подклассом dict, поэтому это должно быть как-то возможно.

qdict = QueryDict(dict) # this does not actually work
print qdict.urlencode()

Как бы я работал со второй до последней строки?

Ответы на вопрос(4)

так и для нескольких значений ключа:

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

но более логичный способ достижения этого - использование 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']
 Izkata18 июн. 2018 г., 20:05
Хм .. В отличие от других, которые обрабатывают только отдельные значения, для этого требуется, чтобы значение было списком (оно разбивает строки на список символов). Кажется тамНет простого способа справиться с обоими.

ображаемого объекта) в строку запроса.

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Урленкод имеетперемещено в urllib.parse:

from urllib.parse import urlencode

params = {'a': 'one', 'b': 'two', }
urlencode(params)
'a=one&b=two'
 winsmith15 нояб. 2012 г., 10:42
Ваш ответ - то, что я хотел, но не точный ответ на вопрос. Вы не возражаете, если примете другой ответ, но создадите новый вопрос, где вы сможете снова опубликовать этот ответ?
 winsmith13 нояб. 2012 г., 16:35
м) этоэто так очевидно в ретроспективе.
Решение Вопроса

Как насчет?

from django.http import QueryDict
dict = {'a': 'one', 'b': 'two', }
qdict = QueryDict('', mutable=True)
qdict.update(dict)
 miki72513 нояб. 2012 г., 16:41
Thanx. Не знал другого подхода. Здорово.
 miki72513 нояб. 2012 г., 16:37
Извините, я пропустил строку необходимого кода ... обновленный ответ.
 winsmith13 нояб. 2012 г., 16:35
Это не работает, потому что QueryDicts являются неизменяемыми.
 miki72513 нояб. 2012 г., 16:36
Не в соответствии с документами:docs.djangoproject.com/en/dev/ref/request-response/...
 Ivan Ivanov26 мая 2014 г., 01:55
Вместо копирования вы можете сразу создать изменчивый QueryDict:QueryDict('', mutable=True)
 winsmith13 нояб. 2012 г., 16:36
должно бытьqdict = QueryDict('')и тогда это действительно работает. Спасибо.

Ваш ответ на вопрос