Django:在子查询中返回数组

Alx*_*ejo 8 django postgresql

我有一个模型ApplicationJudge它通过外键分配了许多对象。每个人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
    )
Run Code Online (Sandbox Code Playgroud)

但我收到此错误:

用作表达式的子查询返回的多行

values_list应返回值的数组,所以我不知道为什么多行正从我的子查询返回的。任何指针?谢谢。

Wil*_*sem 9

首先,在大多数(所有)数据库中,数组通常不是一个很好实现的结构,所以我建议尽可能远离它。特别是因为它将行数据结构化为单列,这使得执行JOINs 等变得更加困难。

但是如果你真的想要这个,你可以使用ArrayAgg聚合函数。然而,这是PostgreSQL 特定的功能,因此您失去了选择另一个数据库系统的自由。

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

from django.contrib.postgres.aggregates import ArrayAgg

Application.objects.annotate(
    score_array=ArrayAgg('judge__total_score')
)
Run Code Online (Sandbox Code Playgroud)

所以这不需要SubQuery.

  • @Audiopolis,您可以在代码共享中使用“ArraySubquery”而不是“ArrayAgg” (2认同)