Supongamos que tengo el siguiente QueryDict:
<QueryDict: {u'num': [0], u'var1': [u'value1', u'value2'], u'var2': [u'8']}>
Me gustaría tener un diccionario de esto, por ejemplo:
{'num': [0], 'var1':['value1', 'value2'], 'var2':['8']}
(No me importa si el símbolo Unicode u
permanece o desaparece).
Si lo hago queryDict.dict()
, como sugiere el sitio de django , pierdo los valores adicionales que pertenecen a var1
, por ejemplo:
{'num': [0], 'var1':['value2'], 'var2':['8']}
Estaba pensando en hacer esto:
myDict = {}
for key in queryDict.iterkeys():
myDict[key] = queryDict.getlist(key)
¿Existe una forma mejor?
dict(queryDict.lists())
parece funcionardict(queryDict)
.Nuevo en Django> = 1.4.
QueryDict.dict()
https://docs.djangoproject.com/en/stable/ref/request-response/#django.http.QueryDict.dict
fuente
Esto es lo que terminé usando:
Según mi uso, esto parece proporcionarle una lista que puede enviar, por ejemplo, un constructor de formularios.
EDITAR: tal vez este no sea el mejor método. Parece que si quieres, por ejemplo, escribir
QueryDict
en un archivo por alguna loca razón,QueryDict.urlencode()
es el camino a seguir. Para reconstruir elQueryDict
simplemente hazloQueryDict(urlencoded_data)
.fuente
fuente
Si no desea los valores como matrices, puede hacer lo siguiente:
zip es una herramienta poderosa. Lea más sobre ella aquí http://docs.python.org/2/library/functions.html#zip
fuente
QueryDict.dict()
(es decirrequest.POST.dict()
) y devolverá los valores correctamente.Me encontré con un problema similar, queriendo guardar valores arbitrarios de un formulario como valores serializados.
Mi respuesta evita iterar explícitamente el contenido del diccionario:
dict(querydict.iterlists())
Para recuperar un valor similar a un diccionario que funciona como el original, se usa una función inversa
QueryDict.setlist()
para completar un nuevoQueryDict
valor. En este caso, no creo que la iteración explícita sea evitable.Mis funciones de ayuda se ven así:
fuente
Actualizar:
Tenga en cuenta: subrayar
_
en el método iterlists dequeryDict
. Versión de Django: 1.5.1fuente
dict(request.POST)
devuelve un diccionario de Python extraño con valores envueltos en matriz.donde como
{x:request.POST.get(x) for x in request.POST.keys()}
devuelve la salida esperada.fuente
QueryDict.dict()
(es decirrequest.POST.dict()
) y devolverá los valores correctamente.simplemente agrega
queryDict=dict(request.GET)
oqueryDict=dict(QueryDict)
En su vista, los datos se guardarán en querDict como python Dict.
fuente
Así es como resolví ese problema:
fuente
Como yo, probablemente esté más familiarizado con los
Dict()
métodos en Python. Sin embargo,QueryDict()
también es un objeto fácil de usar. Por ejemplo, tal vez quisiera obtener el valor derequest.GET QueryDict()
.Esto se puede hacer de esta manera:
request.GET.__getitem__(<key>)
.QueryDict()
documentación: https://docs.djangoproject.com/en/2.0/ref/request-response/#django.http.QueryDictfuente
request.GET.get(<key>)
orequest.GET.getlist(<key>)
Con
Django 2.2
pocas soluciones limpias:QueryDict.dict()
es más simple pero se romperáQueryDict
con listas como valores, por ejemplo:saldrá
dict(QueryDict)
es mejor porque hará un diccionario correcto de listas:saldrá
cual es correcta.
fuente
Probé ambos
dict(request.POST)
y merequest.POST.dict()
di cuenta de que si tienelist
valores, por ejemplo,'var1':['value1', 'value2']
anidados en surequest.POST
, el later (request.POST.dict()
) solo me dio acceso al último elemento en una lista anidada, mientras que el anterior (dict(request.POST)
) me permitió acceder a todos los elementos en una lista anidada.Espero que esto ayude a alguien.
fuente