Django-Modelle sind nicht ajax serializable
-
12-09-2019 - |
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.
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 .