PrimaryKeyRelatedField字段打印外表的ID,但api要求返回值。是否有任何自定义方式来获取值
class Album(models.Model):
album_name = models.CharField(max_length=100)
artist = models.CharField(max_length=100)
class Track(models.Model):
album = models.ForeignKey(Album, related_name='tracks')
order = models.IntegerField()
title = models.CharField(max_length=100)
duration = models.IntegerField()
class Meta:
unique_together = ('album', 'order')
order_by = 'order
class AlbumSerializer(serializers.ModelSerializer):
tracks = serializers.PrimaryKeyRelatedField(many=True, read_only=True)
class Meta:
model = Album
fields = ('album_name', 'artist', 'tracks')
结果:
{
'album_name': 'The Roots',
'artist': 'Undun',
'tracks': [
89,
90,
91,
...
]
}
有没有办法以下面的格式获得输出:
{
'album_name': 'The Roots',
'artist': 'Undun',
'tracks': [
{'order': 1, 'title': 'Public Service Announcement', 'duration': 245},
{'order': 2, 'title': 'What More Can I Say', 'duration': 264},
{'order': 3, 'title': 'Encore', 'duration': 159},
]
}
答案 0 :(得分:1)
您可以通过为track
字段创建序列化程序来实现此目的。请参阅其余框架文档中的nested relationships示例:
class TrackSerializer(serializers.ModelSerializer):
class Meta:
model = Track
fields = ('order', 'title', 'duration')
class AlbumSerializer(serializers.ModelSerializer):
tracks = TrackSerializer(many=True, read_only=True)
class Meta:
model = Album
fields = ('album_name', 'artist', 'tracks')
答案 1 :(得分:1)
另一种方式,尤其是使用depth
选项。
默认的ModelSerializer使用主键进行关系,但是 您还可以使用深度轻松生成嵌套表示 选项:
class AlbumSerializer(serializers.ModelSerializer):
class Meta:
model = Album
fields = ('album_name', 'artist', 'tracks')
depth = 1
深度选项应设置为表示的整数值 在恢复到之前应该遍历的关系深度 平面代表。
如果您的某个字段e.g. (Track)
中有一个子外国模型,您也可以使用depth = 2
来序列化该关系级别。
您可以在documentation
中详细了解相关信息