使用django-rest框架序列化程序从外键值检索选定字段.(如何获取ForeignKey的一些字段)



艺术家、专辑和曲目的My Model class。


class Artist(models.Model):
first_name = models.CharField(max_length=100)
last_name = models.CharField(max_length=100)
email = models.EmailField()


class Album(models.Model):
album_name = models.CharField(max_length=100)
artist = models.ForeignKey(Artist, related_name='albums', on_delete=models.CASCADE)


class Track(models.Model):
album = models.ForeignKey(Album, related_name='tracks', on_delete=models.CASCADE)
title = models.CharField(max_length=100)
duration = models.IntegerField()

我的各个模型的序列化程序。

class ArtistSerializer(serializers.ModelSerializer):
class Meta:
model = Artist
fields = '__all__'


class TrackSerializer(serializers.ModelSerializer):

class Meta:
model = Track
fields = ['title', 'duration']


class AlbumSerializer(serializers.ModelSerializer):
tracks = TrackSerializer(many=True, read_only=True)

class Meta:
model = Album
fields = '__all__'
depth = 1

对于检索,输出为

{'id': 1, 
'tracks': [{'title': 'Public Service Announcement', 'duration': 245}, 
{'title': 'What More Can I Say', 'duration': 264}], 
'album_name': 'The Grey Album', 
'artist': {'id': 1, 'first_name': 'lala', 'last_name': 
'nakara','email':'lalanakara@yahoo.com'}
}

我想要的输出:我想去掉电子邮件字段。我查看了Django rest框架文档,但没有从外键中找到任何与选择性字段相关的内容。

{'id': 1, 
'tracks': [{'title': 'Public Service Announcement', 'duration': 245}, 
{'title': 'What More Can I Say', 'duration': 264}], 
'album_name': 'The Grey Album', 
'artist': {'id': 1, 'first_name': 'lala', 'last_name': 
'nakara'}
}

创建新的艺术家serillizer并排除电子邮件字段。

class ArtistWithNoEmailSerializer(serializers.ModelSerializer):
class Meta:
model = Artist
exclude = ['email']

class AlbumSerializer(serializers.ModelSerializer):
tracks = TrackSerializer(many=True, read_only=True)
artist = ArtistWithNoEmailSerializer()
class Meta:
model = Album
fields = ['id', 'tracks', 'artist', 'album_name']

最新更新