Saltar al contenido

no es JSON serializable

Posterior a investigar en varios repositorios y páginas de internet al terminar nos hemos encontrado la solución que te enseñaremos más adelante.

Solución:

simplejson y json no funciona bien con objetos django.

Los serializadores incorporados de Django solo pueden serializar conjuntos de consultas llenos de objetos Django:

data = serializers.serialize('json', self.get_queryset())
return HttpResponse(data, content_type="application/json")

En tu caso, self.get_queryset() contiene una mezcla de objetos Django y dictados en su interior.

Una opción es deshacerse de las instancias del modelo en el self.get_queryset() y reemplazarlos con dictados usando model_to_dict:

from django.forms.models import model_to_dict

data = self.get_queryset()

for item in data:
   item['product'] = model_to_dict(item['product'])

return HttpResponse(json.simplejson.dumps(data), mimetype="application/json")

Espero que ayude.

La forma más fácil es usar un JsonResponse.

Para un conjunto de consultas, debe pasar una lista de los values para ese conjunto de consultas, así:

from django.http import JsonResponse

queryset = YourModel.objects.filter(some__filter="some value").values()
return JsonResponse("models_to_return": list(queryset))

Descubrí que esto se puede hacer de manera bastante simple usando el método “.values”, que también proporciona campos con nombre:

result_list = list(my_queryset.values('first_named_field', 'second_named_field'))
return HttpResponse(json.dumps(result_list))

La “lista” debe usarse para obtener datos como iterables, ya que el tipo “conjunto de consultas de valor” es solo un dictado si se selecciona como iterable.

Documentación: https://docs.djangoproject.com/en/1.7/ref/models/querysets/#values

Si te ha sido de provecho nuestro post, sería de mucha ayuda si lo compartieras con el resto entusiastas de la programación y nos ayudes a dar difusión a esta información.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *