2017-06-01 6 views
2

以下のモデルクラスとシリアライザクラスを使用すると、トラックの詳細を取得する際にトラックタイトルのみが表示されますが、関連するアーティストは表示されません。Djangoの残りのフレームワークで外部キーフィールドを取得する方法は?

トラックの詳細を取得する際にアーティスト名も表示するにはどうすればよいですか?

models.py

class Artist (models.Model): 
    name = models.CharField(max_length=100) 

    def __str__(self): 
     return self.name 

class Track (models.Model):  
    artist = models.ForeignKey(Artist, blank=True, null=True, on_delete=models.SET_NULL, verbose_name="Artist") 
    title = models.CharField(max_length=100, verbose_name="Title") 

    def __str__(self): 
     return self.title 

serializers.py

class ArtistSerializer(serializers.ModelSerializer): 

    id = serializers.IntegerField(read_only=True) 
    name = serializers.CharField() 

    class Meta: 
     model = Artist 
     fields = ('id', 'name') 

class TrackSerializer(serializers.ModelSerializer): 

    class Meta: 
     model = Track 
     fields = '__all__' 

答えて

1

私は、カスタムフィールドが必要だと思うにそれを使用することができ、このシリアライザを試してみてください:それはこのような何かを生み出す

class TrackSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = Track 
     fields = ('title', 'artist','artist_name') 

    artist_name = serializers.SerializerMethodField('get_artists_name') 

    def get_artists_name(self, obj): 
     return obj.artist.name 

[ 
    { 
     "title": "Don't let me down", 
     "artist": 2, 
     "artist_name": "The Beatles" 
    }, 
    { 
     "title": "Summertime", 
     "artist": 1, 
     "artist_name": "Ella Fitzgerald" 
    } 
] 

1

ForeignKeyのモデルであるINORDERアーティストの詳細を取得するために、

class ArtistSerializer(serializers.ModelSerializer): 

    class Meta: 
     model = Artist 
     fields = '__all__' 

class TrackSerializer(serializers.ModelSerializer): 
    artist = ArtistSerializer() 

    class Meta: 
     model = Track 
     fields = ('title', 'artist') 

、このシリアライザをお試しください、あなたが必要ですdjango-rest-frameworkでネストされたシリアライザを使用する

ネストされたArtistSerializerでTrackSerializerを使用することにより、取得したデータは次のようになり、

{ 
    "title": "Some_Title", 
    "artist": { 
        "id": 2, #or id of the artist. 
        "name": "Artist_name" 
       } 
} 
2

あなたは公式のDjangoの残りの枠組みdocumentations で見ることができるようにあなたは、ネストされた項目のためのシリアライザフィールドを定義する必要があります

まず

class ArtistSerializer(serializers.ModelSerializer): 

    id = serializers.IntegerField(read_only=True) 
    name = serializers.CharField() 

    class Meta: 
     model = Artist 
     fields = ('id', 'name') 

次に、あなたのアーティスト(ネストされた項目)シリアライザを作成しますあなたは、関連するモデルシリアライザ

class TrackSerializer(serializers.ModelSerializer): 
    artist = ArtistSerializer() 

    class Meta: 
     model = Track 
     fields = ('title', 'artist') 
関連する問題