Django Rest Framework - Вложенный список внутри JSON-ответа
Я очень новичок в Django и Django Rest Framework, и у меня возникают трудности с созданием определенного JSON ответа. У меня есть две модели, примерно так:
class Artist(models.model):
artist_id = models.CharField(
max_length=256,
primary_key=True,
)
name = models.CharField(
max_length=256,
null=False,
blank=False,
)
birthplace = models.CharField(
max_length=256,
null=False,
blank=False,
)
class Album(models.Model):
artist = models.ForeignKey(
Artist,
on_delete=models.DO_NOTHING,
db_constraint=False,
null=True,
)
name = models.CharField(
max_length=256,
null=False,
blank=False,
)
label = models.CharField(
max_length=256,
null=False,
blank=False,
)
Я пытаюсь создать ответ JSON, который выглядит следующим образом, где альбомы вложены в исполнителя:
{
"artist_id": "A123",
"name": "Bob Dylan",
"birtplace": "Duluth, Minnesota",
"albums": [
{
"id": 123,
"name": "Bob Dylan",
"label": "Columbia"
},
{
"id": 123,
"name": "The Freewheelin' Bob Dylan",
"label": "Columbia"
}
]
}
Возможно ли это вообще? Я рассматривал select_related, но это, похоже, не работает, поскольку мне кажется, что сначала нужно "ударить" по таблице Artist, а там не определена связь в направлении Artist - Album.
Любая помощь будет очень признательна.
Если вам нужно сделать сериализатор, соответствующий ответу JSON, который предоставлен в вашем вопросе, это будет что-то вроде этого:
class AlbumSerializer(serializers.Serializer):
id = serializers.IntegerField(read_only=True)
name = serializers.CharField(read_only=True)
label = serializers.CharField(read_only=True)
class ArtistSerializer(serializers.Serializer):
id = serializers.IntegerField(read_only=True)
artist_id = serializers.CharField(read_only=True) # I suggest to use the defult id field that comes with Django for now.
name = serializers.CharField(read_only=True)
birthplace = serializers.CharField(read_only=True)
Это простой сериализатор, верно?
Давайте построим ваши представления и предположим, что это запрос GET
, а я предпочитаю использовать APIView
class ListApi(APIView):
def get(self, request):
artist = Artist.objects.all()
artist_serializer = ArtistSerializer(albums, many=True).data
'''
artist_serializer will give us this data, right?
{
"artist_id": "A123",
"name": "Bob Dylan",
"birtplace": "Duluth, Minnesota",
}
So, for every artist in this data have multiple Album, so we need to fetch all albums that belong to this artist.
'''
for artist in artist_serializer:
albums = Album.objects.filter(artist=artist['id'])
artist['albums'] = AlbumSerializer(albums, many=True).data
return Response(artist_serializer)
Если у вас возникнут какие-либо проблемы с пониманием кода, не стесняйтесь спрашивать!