PrimaryKeyRelatedField字段打印外部表的ID但需要值

时间:2017-11-09 22:51:15

标签: django django-models django-rest-framework

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

2 个答案:

答案 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

中详细了解相关信息