the serialized safe queryset parameter objects non leer false example dict allow python json django httpresponse

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?