Django:在子查询中返回数组

时间:2018-06-29 13:00:54

标签: django postgresql

我有一个模型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应该返回一个值数组,所以我不确定为什么从子查询中返回多行。有指针吗?谢谢。

1 个答案:

答案 0 :(得分:2)

首先,在大多数(所有)数据库中,数组通常不是一个实现良好的结构,因此,我建议尽量远离它。尤其是因为它将行数据构造为单个列,这使得执行JOIN等操作变得更加困难。

但是,如果您确实希望这样做,可以使用ArrayAgg聚合函数。但是,这是 PostgreSQL特有的功能,因此您失去了选择另一个数据库系统的自由。

然后您可以通过以下方式获得这样的结果:

from django.contrib.postgres.aggregates import ArrayAgg

Application.objects.annotate(
    score_array=ArrayAgg('judge__total_score')
)

因此,这不需要SubQuery