【问题标题】:DRF + Serializer to return custom data from multiple modelsDRF + Serializer 从多个模型返回自定义数据
【发布时间】:2021-10-28 16:50:40
【问题描述】:

this question 相关,我正在尝试通过 DRF 在一个查询中从多个模型返回数据。

class Artist(models.Model):
    artist_name = models.CharField(max_length=100)

class Genre(models.Model):
    genre_name = models.CharField(max_length=100)

class Album(models.Model):
    album_name = models.CharField(max_length=100)
    artist = models.ForeignKey(Artist, on_delete=models.CASCADE)
    genre = models.ForeignKey(Genre, on_delete=nodels.CASCADE)

我想返回所有艺术家的专辑和流派的所有选项的 JSON 列表。

类似:

{
    "genres": ["techno", "rap", "rock", ...],
    "albums": ["nevermind", "collection", "fragile", ...]
}

我创建了一个自定义序列化程序:

class InfoSerializer(serializers.Serializer):
    albums = serializers.CharField()
    genres = serializers.CharField()

    class Meta:
        fields = ["albums", "genres"]

和一个视图集:

class OptionsViewSet(ViewSet):
    serializer_class = InfoSerializer

    def list(self, request):
        options = [{"albums": Album.objects.all()},
                   {"genres": Genre.objects.all()}]
        results = InfoSerializer(options, many = True)
        results.is_valid()
        return Response(results.data)

我不断收到错误消息:

尝试在序列化程序 InfoSerializer 上获取字段 albums 的值时出现 KeyError ...

【问题讨论】:

    标签: django django-rest-framework django-serializer


    【解决方案1】:

    您正在为 InfoSerializer 提供选项,并且该序列化程序假定 options 具有名为专辑和流派的属性。由于它没有,因此会引发错误。见drf documentation

    您的视图集的设计看起来像是要返回多个实例,但实际上您返回的是一个只有两个键的字典。专辑和流派是相互独立的,因此返回带有 many=True 的数组在这里没有任何意义。

    我建议您在 APIView 中返回类似的内容。 此外,您只能从数据库中检索 album_namegenre_name,这将提高性能。

    {
        "albums": list(Album.objects.all().values_list('album_name', flat=True)),
                       
        "genres": list(Genre.objects.all().values_list('genre_name', flat=True))
    }
    

    【讨论】:

    • 这正是我想要的方式 - 但现在我没有使用任何序列化程序。如果我可以问,序列化程序会是什么样子?谢谢!
    猜你喜欢
    • 2021-10-28
    • 1970-01-01
    • 2017-10-31
    • 2021-07-04
    • 2011-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多