python - serialized - Cómo pasar campos de modelo a un objeto JsonResponse
leer json en django (1)
Para futuras referencias, .values()
devuelve un ValuesQuerySet
que se comporta como un iterable lleno de diccionarios, por lo que al usar la list()
creará una nueva instancia de una list
con todos los diccionarios en ella. Con eso, puedes crear un nuevo dict y serializar eso.
response = JsonResponse(dict(genres=list(Genre.objects.values(''name'', ''color''))))
IIRC, no es seguro tener un objeto JSON que tenga una lista como root y es por eso que Django se está quejando. No pude encontrar ninguna referencia sobre eso ahora para proporcionar una fuente, lo siento.
Django 1.7 introdujo los objetos JsonResponse , que trato de usar para devolver una lista de valores a mi solicitud ajax.
Quiero pasar
>>> Genre.objects.values(''name'', ''color'')
[{''color'': ''8a3700'', ''name'': ''rock''}, {''color'': ''ffff00'', ''name'': ''pop''}, {''color'': ''8f8f00'', ''name'': ''electronic''}, {''color'': ''9e009e'', ''name'': ''chillout''}, {''color'': ''ff8838'', ''name'': ''indie''}, {''color'': ''0aff0a'', ''name'': ''techno''}, {''color'': ''c20000'', ''name'': "drum''n''bass"}, {''color'': ''0000d6'', ''name'': ''worldmusic''}, {''color'': ''a800a8'', ''name'': ''classic''}, {''color'': ''dbdb00'', ''name'': ''hiphop''}]
a un objeto JsonResponse.
Sin embargo, mis intentos fallan.
>>> JsonResponse({''foo'': ''bar'', ''blib'': ''blab''}) # works
<django.http.response.JsonResponse object at 0x7f53d28bbb00>
>>> JsonResponse(Genre.objects.values(''name'', ''color'')) # doesn''t work
Traceback (most recent call last):
File "<console>", line 1, in <module>
File "/home/marcel/Dokumente/django/FlushFM/env/lib/python3.4/site-packages/django/http/response.py", line 476, in __init__
raise TypeError(''In order to allow non-dict objects to be ''
TypeError: In order to allow non-dict objects to be serialized set the safe parameter to False
Esto se debe probablemente a la estructura de datos diferente de Genre.objects.values()
.
¿Cómo se haría esto bien?
[editar]
Con safe=False
me sale
>>> JsonResponse(Genre.objects.values(''name'', ''color''), safe=False)
Traceback (most recent call last):
File "<console>", line 1, in <module>
File "/home/marcel/Dokumente/django/FlushFM/env/lib/python3.4/site-packages/django/http/response.py", line 479, in __init__
data = json.dumps(data, cls=encoder)
File "/usr/lib/python3.4/json/__init__.py", line 237, in dumps
**kw).encode(obj)
File "/usr/lib/python3.4/json/encoder.py", line 192, in encode
chunks = self.iterencode(o, _one_shot=True)
File "/usr/lib/python3.4/json/encoder.py", line 250, in iterencode
return _iterencode(o, 0)
File "/home/marcel/Dokumente/django/FlushFM/env/lib/python3.4/site-packages/django/core/serializers/json.py", line 109, in default
return super(DjangoJSONEncoder, self).default(o)
File "/usr/lib/python3.4/json/encoder.py", line 173, in default
raise TypeError(repr(o) + " is not JSON serializable")
TypeError: [{''color'': ''8a3700'', ''name'': ''rock''}, {''color'': ''ffff00'', ''name'': ''pop''}, {''color'': ''8f8f00'', ''name'': ''electronic''}, {''color'': ''9e009e'', ''name'': ''chillout''}, {''color'': ''ff8838'', ''name'': ''indie''}, {''color'': ''0aff0a'', ''name'': ''techno''}, {''color'': ''c20000'', ''name'': "drum''n''bass"}, {''color'': ''0000d6'', ''name'': ''worldmusic''}, {''color'': ''a800a8'', ''name'': ''classic''}, {''color'': ''dbdb00'', ''name'': ''hiphop''}] is not JSON serializable
Lo que funciona es
>>> JsonResponse(list(Genre.objects.values(''name'', ''color'')), safe=False)
<django.http.response.JsonResponse object at 0x7f53d28bb9e8>
¿Pero no hay una mejor manera de generar un dictado a partir de un objeto Modelo?