python - simple - <Objeto Django> no es JSON serializable
simple json python (5)
Descubrí que esto se puede hacer 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))
"list" se debe usar para obtener datos como iterables, ya que el tipo "value queryset" es solo un dict si se toma como iterable.
Documentación: https://docs.djangoproject.com/en/1.7/ref/models/querysets/#values
Tengo el siguiente código para serializar el conjunto de preguntas;
def render_to_response(self, context, **response_kwargs):
return HttpResponse(json.simplejson.dumps(list(self.get_queryset())),
mimetype="application/json")
Y a continuación está mi get_querset()
[{''product'': <Product: hederello ()>, u''_id'': u''9802'', u''_source'': {u''code'': u''23981'', u''facilities'': [{u''facility'': {u''name'': {u''fr'': u''G/xe9n/xe9ral'', u''en'': u''General''}, u''value'': {u''fr'': [u''bar'', u''r/xe9ception ouverte 24h/24'', u''chambres non-fumeurs'', u''chambres familiales'',.........]}]
Lo cual necesito serializar. Pero dice que no puede serializar el <Product: hederello ()>
. Porque la lista está compuesta de ambos objetos django y dicts. Algunas ideas ?
Desde la versión 1.9 Manera más fácil y oficial de obtener json
from django.http import JsonResponse
from django.forms.models import model_to_dict
return JsonResponse( model_to_dict(modelinstance) )
La forma más fácil es usar un JsonResponse .
Para un conjunto de consulta, debe pasar una lista de los values
para ese conjunto de consulta, así:
from django.http import JsonResponse
queryset = YourModel.objects.filter(some__filter="some value").values()
return JsonResponse({"models_to_return": list(queryset)})
Primero agregué un método to_dict a mi modelo;
def to_dict(self):
return {"name": self.woo, "title": self.foo}
Entonces tengo esto;
class DjangoJSONEncoder(JSONEncoder):
def default(self, obj):
if isinstance(obj, models.Model):
return obj.to_dict()
return JSONEncoder.default(self, obj)
dumps = curry(dumps, cls=DjangoJSONEncoder)
y al final use esta clase para serializar mi queryset.
def render_to_response(self, context, **response_kwargs):
return HttpResponse(dumps(self.get_queryset()))
Esto funciona bastante bien
simplejson
y json
no funcionan bien con los objetos django.
Los serializers incorporados de Django solo pueden serializar los conjuntos de consultas llenos de objetos django:
data = serializers.serialize(''json'', self.get_queryset())
return HttpResponse(data, content_type="application/json")
En su caso, self.get_queryset()
contiene una mezcla de objetos django y dicts dentro.
Una opción es deshacerse de las instancias de modelo en self.get_queryset()
y reemplazarlas por dicts 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.