2013-03-11 3 views
9

I Ereignisse bekam, die an Orten geschehen:Django REST Framework: Definieren Sie Felder in verschachtelten Objekten?

class EventSerializer(serializers.HyperlinkedModelSerializer): 
    id = serializers.Field() 
    class Meta: 
     model = Event 
     depth = 2 
     fields = ('url','id','title','date_start','date_end','description', 'price', 'location') 

Welche Ausgänge:

class Event(models.Model): 
    title = models.CharField(max_length=200) 
    date_published = models.DateTimeField('published date',default=datetime.now, blank=True) 
    date_start = models.DateTimeField('start date') 
    date_end = models.DateTimeField('end date') 
    def __unicode__(self): 
     return self.title 
    description = models.TextField() 
    price = models.IntegerField(null=True, blank=True) 
    tags = TaggableManager() 
    location = models.ForeignKey(Location, blank=False) 

class Location(models.Model): 
    location_title = models.CharField(max_length=200) 
    location_date_published = models.DateTimeField('published date',default=datetime.now, blank=True) 
    location_latitude = models.CharField(max_length=200) 
    location_longitude = models.CharField(max_length=200) 
    location_address = models.CharField(max_length=200) 
    location_city = models.CharField(max_length=200) 
    location_zipcode = models.CharField(max_length=200) 
    location_state = models.CharField(max_length=200) 
    location_country = models.CharField(max_length=200) 
    location_description = models.TextField() 
    def __unicode__(self): 
     return u'%s' % (self.location_title) 

ich die Ergebnisse aller über bekommen

{ 
      "url": "http://localhost:8000/api/event/3/", 
      "id": 3, 
      "title": "Testing", 
      "date_start": "2013-03-10T20:19:00Z", 
      "date_end": "2013-03-10T20:19:00Z", 
      "description": "fgdgdfg", 
      "price": 10, 
      "location": { 
       "id": 2, 
       "location_title": "Mighty", 
       "location_date_published": "2013-03-10T20:16:00Z", 
       "location_latitude": "37.767475", 
       "location_longitude": "-122.406878", 
       "location_address": "119 Utah St, San Francisco, CA 94103, USA", 
       "location_city": "San Francisco", 
       "location_zipcode": "94103", 
       "location_state": "California", 
       "location_country": "United States", 
       "location_description": "Some place" 
      } 
     }, 

Allerdings möchte ich nicht es um alle Felder zu greifen, da ich nicht alle brauche. Wie kann ich definieren, welche Felder von meinem verschachtelten Objekt abgerufen werden sollen? Vielen Dank!

Antwort

17

Serializer können verschachtelt werden, tun so etwas wie dieses ...

class LocationSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = Location 
     fields = (...) 

class EventSerializer(serializers.HyperlinkedModelSerializer): 
    id = serializers.Field() 
    location = LocationSerializer() 

    class Meta: 
     model = Event 
     fields = ('url','id','title','date_start','date_end','description', 'price', 'location') 
+0

Wo ist es dokumentiert? –

+4

Im Bereich "Serializer": "Umgang mit verschachtelten Objekten". [Hier] (http://django-rest-framework.org/api-guide/serializers.html#dealing-with-nested-objects). –

+2

Rest-Rahmen ist großartig –

4

Ich habe dies gewesen und nicht eine perfekte Lösung erhalten hat, aber ich habe etwas, das Sie es überprüfen kann.

wird diese Methode nicht verschachtelte Serializer erstellen

**class LocationSerializer(serializers.ModelSerializer):** 
    class Meta: 
      model = Location 
      fields = (...)  #does not matter 
      exclude = (...)  #does not matter 

class EventSerializer(serializers.ModelSerializer):** 
    loc_field_1 = serializers.CharField(required=False,*source='location.loc_field_1'*) 
    loc_field_2 = serializers.CharField(required=False,*source='location.loc_field_2'*) 

    ***#ADD YOUR DESIRE FIELD YOU WANT TO ACCESS FROM OTHER SERIALIZERS*** 


    class Meta: 
     model = Event 
     fields =('url','id','title','date_start','date_end','description', 'price', 'location') 
3

ich diese Frage gefunden, als ich auf Figur versuchte, wie aus einem Serializer bestimmte Felder ausschließen nur wenn es verschachtelt wurde. Sieht so aus, als hätte Tasawer Nawaz diese Frage ebenfalls. Sie können dies tun, indem Sie get_field_names überschreiben. Hier ist ein Beispiel basierend auf Tom Christie Antwort:

class LocationSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = Location 
     fields = (...) 
     exclude_when_nested = {'location_title', 'location_date_published'} # not an official DRF meta attribute ... 

    def get_field_names(self, *args, **kwargs): 
     field_names = super(LinkUserSerializer, self).get_field_names(*args, **kwargs) 
     if self.parent: 
      field_names = [i for i in field_names if i not in self.Meta.exclude_when_nested] 
     return field_names 

class EventSerializer(serializers.HyperlinkedModelSerializer): 
    id = serializers.Field() 
    location = LocationSerializer() 

    class Meta: 
     model = Event 
     fields = ('url','id','title','date_start','date_end','description', 'price', 'location') 
Verwandte Themen