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.