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.

È stato utile?

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 .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top