如何在Django rest框架中检索外键字段?
问题描述:
下面给出模型和序列化程序类,当我检索跟踪详细信息时,它只会显示跟踪标题,而不显示相关的艺术家。如何在Django rest框架中检索外键字段?
如何在检索跟踪详细信息时显示艺术家名称?
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__'
答
我想你需要自定义字段,试试这个串行:
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"
}
]
此致敬意。
答
试试这个串行,
class ArtistSerializer(serializers.ModelSerializer):
class Meta:
model = Artist
fields = '__all__'
class TrackSerializer(serializers.ModelSerializer):
artist = ArtistSerializer()
class Meta:
model = Track
fields = ('title', 'artist')
中序检索艺术家的细节,这是一个ForeignKey模型, 你需要 在django-rest-framework中使用嵌套的序列化程序。
通过使用TrackSerializer与嵌套ArtistSerializer,检索到的数据会是这个样子,
{
"title": "Some_Title",
"artist": {
"id": 2, #or id of the artist.
"name": "Artist_name"
}
}
答
正如你可以在官方的Django看到REST框架documentations 你应该定义为嵌套项目串行场
首先创建您的Artist(嵌套项目)串行
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')