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

serialized - python return json



Django: "TypeError:[] no es serializable por JSON" ¿Por qué? (3)

Como señaló Vinay, incluso si se lanza a una lista, la serialización a menudo aún falla. Para mí, la serialización falla en los elementos de DateTimeField ( datetime.datetime objects), incluso si solicito un ValuesQuerySet ( ValuesQuerySet una lista) con .values() . La solución para mí fue una comprensión simple.

json.dumps([str(obj) for obj in Model.objects.values()]);

En tu caso, eso sería

return json.dumps({k: str(v) for k, v in self.__dict__.items()})

La magia de str salva el día. La repr built-in también puede ser útil si necesita información de tipo de objeto en su serialización.

¿Cómo puede ser que se haya presentado este error? Ingresé esto:

def json(self): return json.dumps( { ''items'': self.items } )

y obtuve ese error (porque self.items era un queryset vacío (Django)

pero entonces,

def json(self): return json.dumps( { ''items'': [] # Pass in empty list to prove that the error was idiotic. } )

funcionó bien (lo que al menos prueba que el mensaje de error no tiene valor)

¿Esto es porque el conjunto de preguntas define repr () y devuelve ''[]'' como una cadena cuando está vacía o algo ridículo como ese?


Esto es muy frustrante La serialización de Django se queja de todo lo que no es un conjunto de consultas y json.dumps se queja de los objetos del soporte ORM de Django.

>>> from cluster.models import Account >>> import json >>> json.dumps(Account.objects.all()[0]) Traceback (most recent call last): File "<console>", line 1, in <module> File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/__init__.py", line 231, in dumps return _default_encoder.encode(obj) File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/encoder.py", line 201, in encode chunks = self.iterencode(o, _one_shot=True) File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/encoder.py", line 264, in iterencode return _iterencode(o, 0) File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/encoder.py", line 178, in default raise TypeError(repr(o) + " is not JSON serializable") TypeError: <Account: 9de5-2653-000d-81a3 => [email protected]> is not JSON serializable

Versus

>>> serializers.serialize("json", [clusters]) Traceback (most recent call last): File "<console>", line 1, in <module> File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/core/serializers/__init__.py", line 91, in serialize s.serialize(queryset, **options) File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/core/serializers/base.py", line 41, in serialize for field in obj._meta.local_fields: AttributeError: ''QuerySet'' object has no attribute ''_meta''


Los conjuntos de consulta no son serializables listos para usar. Si prueba list(self.items) lugar de solo self.items , eso debería funcionar siempre que los elementos en sí mismos sean serializables por JSON.

Actualización: generará una excepción incluso si no está vacía. No creo que sea aceptado como un error de Django, aunque por supuesto puedes intentarlo; la respuesta más simple es forzar la evaluación usando la list(qs) , como ya he dicho.