我有一个模型Application
,其中有许多Judge
对象是通过ForeignKey分配给它的。每个Judge
将对Application
进行评分。我想在QuerySet中返回应用程序列表以及每个得分值的数组。这是我要达到的目的:
total_scores = Subquery(
Judge.objects
.filter(
application=OuterRef('pk')
)
.values_list(
'total_score',
flat=True
)
)
applications = Application.objects \
.annotate(
score_array=total_scores
)
但是我得到这个错误:
由子查询返回的多于一行用作表达式
values_list
应该返回一个值数组,所以我不确定为什么从子查询中返回多行。有指针吗?谢谢。
答案 0 :(得分:2)
首先,在大多数(所有)数据库中,数组通常不是一个实现良好的结构,因此,我建议尽量远离它。尤其是因为它将行数据构造为单个列,这使得执行JOIN
等操作变得更加困难。
但是,如果您确实希望这样做,可以使用ArrayAgg
聚合函数。但是,这是 PostgreSQL特有的功能,因此您失去了选择另一个数据库系统的自由。
然后您可以通过以下方式获得这样的结果:
from django.contrib.postgres.aggregates import ArrayAgg
Application.objects.annotate(
score_array=ArrayAgg('judge__total_score')
)
因此,这不需要SubQuery
。