2013-03-11 10 views
9

私は場所で発生するイベントだ:Django RESTフレームワーク:ネストされたオブジェクトのフィールドを定義しますか?

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

{ 
      "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" 
      } 
     }, 

をしかし、私はしたくない、私は経由ですべての結果を得ることができ

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) 

を私はそれらのすべてを必要としないので、すべてのフィールドをつかむ。ネストされたオブジェクトから取得するフィールドを定義するにはどうすればよいですか?ありがとう!

答えて

17

シリアライザは、ネストされたので、このような何かを行うことができます...

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

記載されている場所はどこですか? –

+4

シリアライザのセクションでは、「ネストされたオブジェクトの処理」を参照してください。 [Here](http://django-rest-framework.org/api-guide/serializers.html#dealing-with-nested-objects)。 –

+2

レストフレームワークは素晴らしい –

4

私はこれに行ったことがあると完璧なソリューションを取得できませんでした、しかし、私はあなたがそれをチェックすることが何かをしました。

この方法は、私は、私はそれがネストされていただけシリアライザから特定のフィールドを除外する方法を把握しようとしていたこの質問を見つけた、ネストされたシリアライザ

**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

を作成しません。 Tasawer Nawazもそのような質問をしたように見えます。 get_field_namesを上書きすることでそれを行うことができます。ここにTom Christieの答えに基づく例があります:

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') 
関連する問題