2009-09-22 9 views
10

Ho una vista semplice che sto usando per sperimentare con AJAX.I modelli di Django non sono serializzabili 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 tutti i modelli funziona e restituisce questo:

{"e": "11", "d": "2009"} 

Perché non riesco a paragonare semplicemente il mio uno dei modelli django predefiniti? Ho lo stesso comportamento con qualsiasi modello che utilizzo.

+0

domanda ambigua, non in realtà una domanda nel titolo della domanda – geejay

risposta

29

Hai solo bisogno di aggiungere, nel vostro .dumps chiamata, un argomento default=encode_myway per far simplejson sanno cosa fare quando si passa i dati cui tipi non sa - la risposta alla tua "perché" questione è, naturalmente, che non hai detto povero simplejson cosa fare con una delle istanze dei tuoi modelli.

E, naturalmente, è necessario scrivere encode_myway di fornire dati JSON-codificabili, ad 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) - È tua responsabilità come programmatore di applicazioni associare tutto il resto in/da questi tipi di dati elementari e in simplejson che viene in genere eseguito tramite una funzione passata a default= a dump o dumps.

In alternativa, è possibile utilizzare il serializzatore che fa parte di Django, vedere the docs.

+0

+1 per il riferimento al serializzatore incorporato. –

+2

non è possibile che django sia abbastanza intelligente da sapere quali proprietà sono realmente importanti (ovviamente in base a quali proprietà l'utente ha definito nel modello) all'utente finale e tagliare questo dolore in a ## per impostazione predefinita? –

Problemi correlati