Vamos fingir que tenho o seguinte QueryDict:
<QueryDict: {u'num': [0], u'var1': [u'value1', u'value2'], u'var2': [u'8']}>
Eu gostaria de ter um dicionário fora disso, por exemplo:
{'num': [0], 'var1':['value1', 'value2'], 'var2':['8']}
(Não me importo se o símbolo Unicode u
permanece ou se vai.)
Se o fizer queryDict.dict()
, conforme sugerido pelo site django , perco os valores extras pertencentes a var1
, por exemplo:
{'num': [0], 'var1':['value2'], 'var2':['8']}
Eu estava pensando em fazer isso:
myDict = {}
for key in queryDict.iterkeys():
myDict[key] = queryDict.getlist(key)
Existe uma maneira melhor?
dict(queryDict.lists())
parece funcionardict(queryDict)
.Novo no Django> = 1.4.
QueryDict.dict()
https://docs.djangoproject.com/en/stable/ref/request-response/#django.http.QueryDict.dict
fonte
Isso é o que acabei usando:
Pelo meu uso, isso parece lhe dar uma lista que você pode enviar de volta, por exemplo, um construtor de formulário.
EDIT: talvez este não seja o melhor método. Parece que se você deseja, por exemplo, gravar
QueryDict
em um arquivo por qualquer motivo maluco,QueryDict.urlencode()
é o caminho a seguir. Para reconstruir o queQueryDict
você simplesmente fazQueryDict(urlencoded_data)
.fonte
fonte
Se você não quiser os valores como Arrays, pode fazer o seguinte:
zip é uma ferramenta poderosa, leia mais sobre ela aqui http://docs.python.org/2/library/functions.html#zip
fonte
QueryDict.dict()
(ierequest.POST.dict()
) e retornará os valores corretamente.Eu tive um problema semelhante, querendo salvar valores arbitrários de um formulário como valores serializados.
Minha resposta evita iterar explicitamente o conteúdo do dicionário:
dict(querydict.iterlists())
Para recuperar um valor semelhante a um dicionário que funciona como o original, uma função inversa é usada
QueryDict.setlist()
para preencher um novoQueryDict
valor. Nesse caso, não acho que a iteração explícita seja evitável.Minhas funções auxiliares são assim:
fonte
Atualizar:
Observação: sublinhado
_
no método iterlists dequeryDict
. Versão Django: 1.5.1fonte
dict(request.POST)
retorna um dicionário python estranho com valores agrupados de matriz.onde como
{x:request.POST.get(x) for x in request.POST.keys()}
retorna a saída esperada.fonte
QueryDict.dict()
(ou sejarequest.POST.dict()
) e ele retornará os valores corretamente.simplesmente adicione
queryDict=dict(request.GET)
ouqueryDict=dict(QueryDict)
Em sua visualização, os dados serão salvos em querDict como python Dict.
fonte
Foi assim que resolvi esse problema:
fonte
Como eu, você provavelmente está mais familiarizado com os
Dict()
métodos em python. No entanto, oQueryDict()
também é um objeto fácil de usar. Por exemplo, talvez você queira obter o valor derequest.GET QueryDict()
.Você pode fazer isso da seguinte forma:
request.GET.__getitem__(<key>)
.QueryDict()
documentação: https://docs.djangoproject.com/en/2.0/ref/request-response/#django.http.QueryDictfonte
request.GET.get(<key>)
ourequest.GET.getlist(<key>)
Com,
Django 2.2
existem algumas soluções limpas:QueryDict.dict()
é mais simples, mas quebraráQueryDict
com listas como valores, por exemplo:irá produzir
dict(QueryDict)
é melhor porque fará um dicionário correto de listas:irá produzir
qual é correto.
fonte
Experimentei os dois
dict(request.POST)
erequest.POST.dict()
percebi que, se você tiverlist
valores, por exemplo,'var1':['value1', 'value2']
aninhados em seurequest.POST
, o último (request.POST.dict()
) apenas me deu acesso ao último item em uma lista aninhada, enquanto o anterior (dict(request.POST)
) me permitiu acessar todos os itens em uma lista aninhada.Espero que isso ajude alguém.
fonte