Django modèles ne sont pas sérialisable ajax
-
12-09-2019 - |
Question
J'ai une simple vue que j'utilise pour expérimenter avec 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')
renvoie les éléments suivants:
TypeError at /sched/shifts/2009/11/9/
<User: someguy> is not JSON serializable
Si je prends les données en ligne [ « x »] de sorte que je ne suis pas référence à des modèles, il fonctionne et renvoie ceci:
{"e": "11", "d": "2009"}
Pourquoi ne peut pas analyser simplejson mon un des modèles django par défaut? Je reçois le même comportement avec tout modèle que j'utilise.
La solution
Vous avez juste besoin d'ajouter, dans votre appel .dumps
, un argument default=encode_myway
pour laisser simplejson
savoir quoi faire lorsque vous passez des données dont les types ne sait pas - la réponse à votre « pourquoi » est bien sûr que vous pas dit pauvres simplejson
ce qu'il faut faire avec l'un des cas de vos modèles.
Et bien sûr, vous devez écrire encode_myway
pour fournir des données JSON-codable, par exemple:.
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")
En gros, JSON sait très types de données élémentaires (chaînes, ints et flotteurs, regroupés en dicts et listes) - il est de votre responsabilité en tant que programmeur d'application pour correspondre à tout le reste dans / à partir de ces types de données élémentaires, et simplejson
qui est typiquement effectuée par une fonction passée à default=
à dump
ou dumps
temps.
Vous pouvez utiliser le sérialiseur json
qui fait partie de Django, voyez les docs .