peticiones from example python django

python - from - peticiones post django



Django: ¿Puedo crear un QueryDict desde un diccionario? (4)

Imagina que tengo un diccionario en mi aplicación Django:

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

Ahora quiero crear fácilmente una lista urlencoded de parámetros GET de este diccionario. Por supuesto, podría recorrer el diccionario, las claves y los valores de urlencode y luego concatenar la cadena por mí mismo, pero debe haber una forma más fácil. Me gustaría usar una instancia de QueryDict. QueryDict es una subclase de dict, por lo que debería ser posible de alguna manera.

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

¿Cómo haría que la segunda hasta la última línea funcionara?


¿Qué tal si?

from django.http import QueryDict dict = {''a'': ''one'', ''b'': ''two'', } qdict = QueryDict('''', mutable=True) qdict.update(dict)


En realidad, una forma un poco indirecta pero más lógica de lograrlo es usar MultiValueDict. De esta manera, los valores múltiples por clave se pueden almacenar en un método QueryDict y .getlist que debería funcionar bien.

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'']


Mi solución funciona tanto para valores clave simples como múltiples:

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


Python tiene una herramienta integrada para codificar un diccionario (cualquier objeto de mapeo) en una cadena de consulta

params = {''a'': ''one'', ''b'': ''two'', } urllib.urlencode(params) ''a=one&b=two''

http://docs.python.org/2/library/urllib.html#urllib.urlencode

QueryDict toma una cadena de consulta como primer parámetro de su constructor

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

Actualización: en Python3 , urlencode se ha movido a urllib.parse :

from urllib.parse import urlencode params = {''a'': ''one'', ''b'': ''two'', } urlencode(params) ''a=one&b=two''