Django Rest Framework - JSON 响应中的嵌套列表

Django Rest Framework - Nested List Inside JSON Response

我对 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,但这似乎不起作用,因为我觉得我需要先 'hit' 艺术家 table,并且没有在艺术家的方向上定义任何关系到相册。

如有任何帮助,我们将不胜感激。

如果您需要制作一个与您问题中提供的 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)

如果您在理解代码方面遇到任何问题,请随时提问!