Frage

Ich habe eine einfache Ansicht, die ich mit AJAX experimentieren bin mit.

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')

Das gibt folgende Möglichkeiten:

TypeError at /sched/shifts/2009/11/9/

<User: someguy> is not JSON serializable

Wenn ich die Daten herausnehmen [ ‚x‘] Linie so, dass ich Referenzierung keine Modelle es funktioniert und gibt diese:

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

Warum kann simplejson mein eines der Standard-django Modelle analysieren? Ich erhalte das gleiche Verhalten bei jedem Modell, das ich verwenden.

War es hilfreich?

Lösung

Sie müssen nur hinzufügen, in Ihrem .dumps Gespräch führen, ein default=encode_myway Argument wissen lassen simplejson was zu tun ist, wenn Sie es Daten, deren Typen passieren es nicht wissen - die Antwort auf Ihre „Warum“ Frage ist natürlich, dass Sie haben nicht sagte schlecht simplejson was bei einem Ihrer Modelle Instanzen zu tun.

Und natürlich müssen Sie encode_myway schreiben JSON-codierbaren Daten zu liefern, z.

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")

Im Grunde genommen weiß JSON über sehr elementaren Datentypen (Strings, Ints und Schwimmer, gruppiert in dicts und Listen) - es ist Ihre Verantwortung als Anwendungsprogrammierer alles andere in / aus solchen elementaren Datentypen zu entsprechen, und in simplejson das ist typischerweise durch eine Funktion getan bestand bei default= oder dump Zeit dumps.

Alternativ können Sie die json Serializer verwenden, die Teil von Django ist, finden Sie unter die Dokumentation .

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top