django - DRF + Serializer 从多个模型返回自定义数据
问题描述
与这个问题相关,我试图在 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)
我不断收到错误消息:
尝试获取序列化程序上的字段值时出现
albums
KeyErrorInfoSerializer
...
解决方案
您正在为 InfoSerializer 提供选项,并且该序列化程序假定options
具有名为专辑和流派的属性。由于它没有,因此会引发错误。请参阅drf 文档
您的视图集的设计看起来像您正在返回多个实例,但实际上您返回的是一个只有两个键的字典。专辑和流派是相互独立的,所以返回一个数组 withmany=True
在这里没有任何意义。
我建议您在 APIView 中返回类似的内容。此外,您只能从数据库中检索album_name
and genre_name
,这将使其性能更高。
{
"albums": list(Album.objects.all().values_list('album_name', flat=True)),
"genres": list(Genre.objects.all().values_list('genre_name', flat=True))
}
推荐阅读
- java - 上传到 Hadoop 集群时依赖版本不正确
- android - 反应导致空白屏幕的本机矢量图标
- r - R dplyr 基于组和列有条件地聚合
- python-3.x - 如何循环数据框的列,然后将它们称为 df.col 而不让 python 认为 col 是一种方法?
- excel - 停止在浏览器中打开目录路径
- codeigniter - 使用多个 url 段 codeigniter
- html - 在语义上为关键字索引推荐哪些 HTML 元素(在书籍中)?
- javascript - 在该视图中如何保持菜单项突出显示?
- python - 登录后如何从网络表格中的单元格中抓取数据?
- r - ggplot中的嵌套帕累托图