首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在django-rest-framework序列化程序中扁平化对象列表?

如何在django-rest-framework序列化程序中扁平化对象列表?
EN

Stack Overflow用户
提问于 2019-03-26 22:51:01
回答 1查看 2.1K关注 0票数 2

我有3个由ForeignKey连接的django模型:

# models.py
class Album(models.Model):
    some_fields

class Track(models.Model):
    some_fields
    album = models.ForeignKey(
        Album,
        related_name='tracks',
        on_delete=models.CASCADE,
    )

class Comment(models.Model):
    some_fields
    track = models.ForeignKey(
        Track,
        related_name='comments',
        on_delete=models.CASCADE,
    )

我想序列化专辑模型,以查看其所有曲目的所有评论。我已经创建了如下序列化文件:

# serializers.py
class TrackSerializer(serializers.ModelSerializer):

    class Meta:
        model = Album
        fields = (some_fields, 'comments')

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

    class Meta:
        model = Album
        fields = (some_fields, 'tracks')

通过这种方式,我可以获得嵌套列表中的所有数据。我想直接在album对象下查看专辑曲目的所有评论。

# Output albums
[{
    "some_fields": some_values,
    "tracks": [{ "some_fields": some_values, "comments": [ comment1, comment2 ]},
            { "some_fields": some_values, "comments": []},
            { "some_fields": some_values, "comments": [ comment3 ]},]
},
{
    "some_fields": some_values,
    "tracks": [{ "some_fields": some_values, "comments": [ comment4, comment5 ]},
            { "some_fields": some_values, "comments": []},
            { "some_fields": some_values, "comments": [ comment6 ]},]
}]

# Desired output albums
[{
    "some_fields": some_values,
    "tracks": [{ "some_fields": some_values},
            { "some_fields": some_values},
            { "some_fields": some_values},],
    "comments": [ comment1, comment2, comment3]
},
{
    "some_fields": some_values,
    "tracks": [{ "some_fields": some_values},
            { "some_fields": some_values},
            { "some_fields": some_values},],
    "comments": [ comment4, comment5, comment6]
}]

我试图在序列化程序文件中直接扁平化列表,但是我得到"TypeError:'ListSerializer‘object is not iterable“。

# serializers.py
class AlbumSerializer(serializers.ModelSerializer):
    tracks = TrackSerializer(many=True, read_only=True)
    comments = [comment for track in tracks for comment in track.comments]

    class Meta:
        model = Album
        fields = (some_fields, 'tracks', 'comments')

有没有什么巧妙的方法可以直接用序列化程序输出一个扁平化的列表?或者我应该稍后在views.py中完成?现在它看起来就像这样:

# views.py
class AlbumMixin(object):
    model = Album
    raise_exception = True
    serializer_class = AlbumSerializer

    def get_queryset(self):
        return Album.objects.all()

class AlbumList(AlbumMixin, generics.ListCreateAPIView):
    pass
EN

回答 1

Stack Overflow用户

发布于 2019-03-26 23:13:13

您可以尝试使用serializerMethodField

# serializers.py
class AlbumSerializer(serializers.ModelSerializer):
    tracks = TrackSerializer(many=True, read_only=True)
    comments = serializers.SerializerMethodField()

    class Meta:
        model = Album
        fields = (some_fields, 'tracks', 'comments')

    def get_comments(self, obj):
        comments = Comments.objects.filter(track__album_id=obj.pk)
        return CommentSerializer(comments, many=True).data
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55360080

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档