我有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
发布于 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
https://stackoverflow.com/questions/55360080
复制相似问题