У меня есть 3 модели django, объединенные ForeignKey:
# 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')
Таким образом, я получаю все данные, кроме вложенных списков. Я хотел бы просмотреть все комментарии треков альбома прямо под объектом альбома.
# 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 'не повторяется».
# 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