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.

Était-ce utile?

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 .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top