modelos de Django no se Ajax serializable
-
12-09-2019 - |
Pregunta
Tengo una visión simple que estoy usando para experimentar con AJAX.
def get_shifts_for_day(request,year,month,day):
data= dict()
data['d'] =year
data['e'] = month
data['x'] = User.objects.all()[2]
return HttpResponse(simplejson.dumps(data), mimetype='application/javascript')
Esto devuelve lo siguiente:
TypeError at /sched/shifts/2009/11/9/
<User: someguy> is not JSON serializable
Si tomo los datos de [ 'x'] línea, de modo que no estoy haciendo referencia cualquier modelo funciona y devuelve lo siguiente:
{"e": "11", "d": "2009"}
¿Por qué no puede mi simplejson analizar uno de los modelos de Django por defecto? Me sale el mismo comportamiento con cualquier modelo que uso.
Solución
Sólo tiene que añadir, en su llamada .dumps
, un argumento para dejar default=encode_myway
simplejson
sabe qué hacer cuando se le pasa datos cuyo tipo no sabe - la respuesta a su "por qué" es, por supuesto, que se no tener dijo pobres simplejson
qué hacer con uno de los casos sus modelos.
Y, por supuesto, tiene que escribir encode_myway
para proporcionar datos JSON-codificable, por ejemplo:.
def encode_myway(obj):
if isinstance(obj, User):
return [obj.username,
obj.firstname,
obj.lastname,
obj.email]
# and/or whatever else
elif isinstance(obj, OtherModel):
return [] # whatever
elif ...
else:
raise TypeError(repr(obj) + " is not JSON serializable")
Básicamente, JSON sabe tipos de datos acerca muy elemental (cadenas, enteros y flotadores, agrupados en dicts y listas) - es su responsabilidad como un programador de aplicaciones para que coincida con todo lo demás en / de dichos tipos de datos elementales, y en simplejson
que es típicamente hecho a través de una función pasó a default=
en dump
o dumps
tiempo.
Como alternativa, puede utilizar el serializador json
que es parte de Django, vea los documentos .