14

場所で発生するイベントが発生しました:

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)

私はすべての結果を次の方法で得ることができます:

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

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

4

3 に答える 3

26

シリアライザーはネストできるので、次のようにします...

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')
于 2013-03-12T09:20:31.517 に答える
8

私はこれに行ったことがあり、完璧な解決策は得られませんでしたが、あなたがそれをチェックするかもしれない何かをしました。

このメソッドはネストされたシリアライザーを作成しません

**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')
于 2015-12-10T11:36:48.033 に答える
7

ネストされている場合にのみ、シリアライザーから特定のフィールドを除外する方法を見つけようとしたときに、この質問を見つけました。TasawerNawazにもその質問があったようです。をオーバーライドすることでそれを行うことができますget_field_names。トムクリスティーの答えに基づく例は次のとおりです。

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')
于 2017-04-01T22:36:10.277 に答える