2010-07-24 41 views
15

La documentación de Django decir en http://docs.djangoproject.com/en/dev/ref/request-response/#django.http.QueryDict.iteritems que QueryDict.iteritems() utiliza la misma lógica último valor como QueryDict.__getitem__(), lo que significa que si la clave tiene más de un valor, __getitem__() devuelve el último valor.cómo obtener todos los valores de una clave de varios valores de Django request.GET QueryDict

Digamos print request.GET se parece a esto:

<QueryDict: {u'sex': [u'1'], u'status': [u'1', u'2', u'3', u'4']}>

Si quiero obtener una cadena como sex=1&status=1&status=2&status=3&status=4 (estándar HTTP GET cosas) el siguiente código no dará los resultados deseados debido al comportamiento iteritems mencionado anteriormente:

mstring = [] 
for gk, gv in request.GET.iteritems(): 
    mstring.append("%s=%s" % (gk, gv)) 
print "&".join(mstring) 

¿Cuál es la forma más eficiente de obtener el resultado que quiero sin demasiados bucles?

Atentamente.

[EDIT]

debo mencionar que no estoy recurriendo a QueryDict.urlencode() porque hay algunas teclas en que request.GET que no quiero en la cadena. Podría alterar la cadena y sacar esa clave = valor, pero me pregunto si hay una mejor manera de hacerlo. Me doy cuenta de que esta información debería haberse mencionado explícitamente.

Respuesta

11

Esto debería funcionar:

mstring = [] 
for key in request.GET.iterkeys(): # "for key in request.GET" works too. 
    # Add filtering logic here. 
    valuelist = request.GET.getlist(key) 
    mstring.extend(['%s=%s' % (key, val) for val in valuelist]) 
print '&'.join(mstring) 
+0

Perfecto. Gracias. – chefsmart

+0

Hay un 'request.GET.iterlists()'. También creo que el enfoque de la respuesta de David a continuación es más claro. – Ski

+0

@Ski: De acuerdo. Es por eso que lo voté a la vez :-) Aún así, no ayuda si quiere filtrar un subconjunto de claves antes de la codificación. – elo80ka

8

creo QueryDict.urlencode logra el resultado deseado si todo lo que quiere hacer es imprimir el QueryDict a continuación, sólo

print request.GET.urlencode() 

debe hacer el truco. ¡Avíseme si intenta hacer otra cosa y trataré de ayudar!

+0

Sí, eso hace el trabajo. Pero lo que no he mencionado en la publicación original (que debería tener) es que hay algunas claves en request.GET que no quiero en la cadena. Podría buscar la cuerda y sacarla, pero me pregunto si hay alguna otra manera. Editaré y volveré a formular mi pregunta. – chefsmart

+3

'data = request.GET.copy()', luego elimine cosas de los datos que no necesita, y luego haga 'data.urlencode()'. – Ski

20
request.META['QUERY_STRING'] 

dará a la cadena de consulta completa

o si desea obtener la lista de valores para una clave dada ejemplo: lista de valores para el estado luego

request.GET.getlist('status') 
+3

funciona para POST también - 'request.POST.getlist ('foo')' – northben

5
request.GET.getlist('status') 
0

puede convertir el querydict en un diccionario

 
map(int,dict(request.GET)["status"]) 
Cuestiones relacionadas