modelli Django non sono Ajax serializzabile
-
12-09-2019 - |
Domanda
Ho una semplice opinione che sto usando per sperimentare 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')
Questo restituisce il seguente:
TypeError at /sched/shifts/2009/11/9/
<User: someguy> is not JSON serializable
Se prendo i dati di [ 'x'] linea in modo che io non sto riferimento a qualsiasi modello funziona e restituisce questo:
{"e": "11", "d": "2009"}
Perché non è possibile analizzare la mia simplejson uno dei modelli di default Django? Ottengo lo stesso comportamento con qualsiasi modello che uso.
Soluzione
Hai solo bisogno di aggiungere, nella chiamata .dumps
, un argomento default=encode_myway
per far simplejson
sapere cosa fare quando si passa i dati cui tipi non sa - la risposta alla tua "perché" questione è, naturalmente, che si non hanno ha detto povero simplejson
ciò che a che fare con uno dei casi i vostri modelli.
E, naturalmente, è necessario scrivere encode_myway
di fornire dati JSON-codificabili, per esempio:.
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")
In sostanza, JSON sa tipi di dati su molto elementare (stringhe, interi e galleggianti, raggruppati in dicts e liste) - è la vostra responsabilità come un programmatore di applicazioni per abbinare tutto il resto in / da tali tipi di dati elementari, e in simplejson
che è in genere fatto attraverso una funzione passata a default=
a dump
o dumps
tempo.
In alternativa, è possibile utilizzare il serializzatore json
che fa parte di Django, vedi la documentazione .