2009-09-22 8 views
10

J'ai une vue simple que j'utilise pour expérimenter avec AJAX.Les modèles Django ne sont pas sérialisables 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') 

Ce retourne 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 ça marche et retourne ceci:

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

Pourquoi est-ce que simplejson ne peut pas analyser mon modèle django par défaut? J'ai le même comportement avec n'importe quel modèle que j'utilise.

+0

question ambiguë, pas réellement une question dans le titre de la question – geejay

Répondre

29

Vous avez juste besoin d'ajouter, dans votre .dumps appel, 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 n'avez pas dit pauvres simplejson quoi faire avec l'une des instances 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") 

Fondamentalement, JSON a connaissance très types de données élémentaires (chaînes, ints et flotteurs, regroupés en dicts et listes) - C'est 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 généralement effectuée par une fonction passée à default= au dump ou dumps temps. Vous pouvez également utiliser le sérialiseur json qui fait partie de Django, voir the docs.

+0

+1 pour la référence au sérialiseur intégré. –

+2

ne peut pas django être assez intelligent pour savoir quelles propriétés compte vraiment (bien sûr en fonction des propriétés que l'utilisateur a définies dans le modèle) à l'utilisateur final et couper cette douleur dans le # # par défaut? –

Questions connexes