2010-03-04 5 views
4

tenez compte du modèle Django suivant:profond JSON sérialisation d'objets Django

class Event(models.Model): 

    startDate = models.DateField() 
    endDate = models.DateField() 

    user = models.ForeignKey(User, null=True) 

plus tard à mon avis, je le fais:

django.core.serializers.serialize("json", Event.objects.all()) 
return HttpResponse(data, mimetype='application/javascript') 

Et obtenir la réponse suivante:

[ 
    { 
    "pk": 1, 
    "model": "myapp.event", 
    "fields": { 
     "startDate": "2010-02-02", 
     "endDate": "2010-02-02", 
     "user": 2 
    } 
    } 
] 

Est-il possible de faire en sorte que le sérialiseur «approfondisse» et sérialise l'utilisateur référencé par l'instance d'événement pour que je puisse accéder ces données dans mon code Javascript?

Il semble que ce soit possible en utilisant la version de développement, mais j'utilise 1.1 FWIW.

Répondre

0

django-tastypie fera l'affaire. Il a toutes sortes de support pour les relations profondes comme ça, en plus d'adhérer à REST, ce qui signifie que si vous utilisez jQuery, un simple $.ajax() fera l'affaire pour obtenir les données. Comme tastypie adhère à REST, il prend également en charge les mises à jour, les insertions et les suppressions en utilisant les méthodes PUT, POST et DELETE, respectivement.

Il prend également en charge JSON, XML et YAML. Il aide à créer une API REST complète, ce qui peut sembler un peu obtus pour ce que vous essayez de faire, mais il est assez facile à configurer et vous permet de personnaliser complètement les champs retournés et les champs qui sont exclus.

Dans votre API, vous feriez quelque chose comme:

from tastypie.resources import Resource 
from django.contrib.auth.models import User 
from myapp import models 

class UserResource(Resource): 
    class Meta: 
     queryset = User.objects.all() 
     resource_name = 'user' 

class EventResource(Resource): 
    user = fields.ToOneField(UserResource, full=True) 
    class Meta: 
     queryset = models.Event.objects.all() 
     resource_name = 'event' 

Ce ne reviendras pas formaté exactement comme spécifié, mais il est facile à configurer, et adhère à une norme Web, qui devient nettement plus utile à mesure que votre projet se développe.