Представим, что у меня есть следующий QueryDict:
<QueryDict: {u'num': [0], u'var1': [u'value1', u'value2'], u'var2': [u'8']}>
Я бы хотел взять из этого словарь, например:
{'num': [0], 'var1':['value1', 'value2'], 'var2':['8']}
(Меня не волнует, u
останется ли символ Юникода или нет.)
Если я это сделаю queryDict.dict()
, как это предлагает сайт django , я потеряю дополнительные значения var1
, например:
{'num': [0], 'var1':['value2'], 'var2':['8']}
Я думал об этом:
myDict = {}
for key in queryDict.iterkeys():
myDict[key] = queryDict.getlist(key)
Есть ли способ лучше?
dict(queryDict.lists())
вроде работаетdict(queryDict)
.Новое в Django> = 1.4.
QueryDict.dict()
https://docs.djangoproject.com/en/stable/ref/request-response/#django.http.QueryDict.dict
источник
Вот что я в итоге использовал:
По моему мнению, это дает вам список, который вы можете отправить обратно, например, в конструктор формы.
РЕДАКТИРОВАТЬ: возможно, это не лучший метод. Кажется, если вы хотите, например, записать
QueryDict
в файл по какой-то безумной причине,QueryDict.urlencode()
это правильный путь. Чтобы восстановить то, чтоQueryDict
вы просто делаетеQueryDict(urlencoded_data)
.источник
источник
Если вам не нужны значения в виде массивов, вы можете сделать следующее:
zip - мощный инструмент, подробнее об этом читайте здесь http://docs.python.org/2/library/functions.html#zip
источник
QueryDict.dict()
(т.е.request.POST.dict()
) и это вернет значения правильно.Я столкнулся с аналогичной проблемой, желая сохранить произвольные значения из формы как сериализованные значения.
В моем ответе я избегаю явного повторения содержимого словаря:
dict(querydict.iterlists())
Чтобы получить словарное значение, которое функционирует как исходное, обратная функция использует
QueryDict.setlist()
для заполнения новогоQueryDict
значения. В этом случае я не думаю, что явной итерации можно избежать.Мои вспомогательные функции выглядят так:
источник
Обновить:
Обратите внимание: подчеркивание
_
в методе iterlistsqueryDict
. Версия Django: 1.5.1источник
dict(request.POST)
возвращает странный словарь Python со значениями, заключенными в массив.где as
{x:request.POST.get(x) for x in request.POST.keys()}
возвращает ожидаемый результат.источник
QueryDict.dict()
(т.е.request.POST.dict()
), и он вернет значения правильно.просто добавьте
queryDict=dict(request.GET)
илиqueryDict=dict(QueryDict)
По вашему мнению, данные будут сохранены в querDict как python Dict.
источник
Вот как я решил эту проблему:
источник
Как и я, вы, вероятно, больше знакомы с
Dict()
методами в Python. ОднакоQueryDict()
это также простой объект в использовании. Например, возможно, вы хотели получить значение изrequest.GET QueryDict()
.Вы можете сделать это следующим образом:
request.GET.__getitem__(<key>)
.QueryDict()
документация: https://docs.djangoproject.com/en/2.0/ref/request-response/#django.http.QueryDictисточник
request.GET.get(<key>)
илиrequest.GET.getlist(<key>)
С
Django 2.2
Есть несколько чистых решений:QueryDict.dict()
самый простой, но он сломаетсяQueryDict
со списками в качестве значений, например:выведет
dict(QueryDict)
лучше, потому что он сделает правильный словарь списков:выведет
что правильно.
источник
Я опробовал оба
dict(request.POST)
иrequest.POST.dict()
и понял, что если у вас естьlist
значения, например,'var1':['value1', 'value2']
вложенные в вашrequest.POST
, later (request.POST.dict()
) предоставил мне доступ только к последнему элементу во вложенном списке, а первый (dict(request.POST)
) позволил мне получить доступ ко всем элементам во вложенном списке.Я надеюсь, что это поможет кому-то.
источник