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)

Если у вас возникнут какие-либо проблемы с пониманием кода, не стесняйтесь спрашивать!

Вернуться на верх