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)
如果您在理解代码方面遇到任何问题,请随时提问!
我对 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)
如果您在理解代码方面遇到任何问题,请随时提问!