代码之家  ›  专栏  ›  技术社区  ›  AlxVallejo

django:返回子查询中的数组

  •  3
  • AlxVallejo  · 技术社区  · 6 年前

    我有个模特 Application 有很多 Judge 通过foreignkey分配给它的对象。每个 法官 将评分 应用 .我想返回查询集中的应用程序列表以及每个得分值的数组。我正努力做到这一点:

    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 回复  |  直到 6 年前
        1
  •  3
  •   willeM_ Van Onsem    6 年前

    首先,在大多数(全部)数据库中,数组通常不是一个很好实现的结构,所以我建议尽可能远离它。尤其是因为它将行级数据构造为单个列,这使得执行起来更加困难 JOIN S等。

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

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

    from django.contrib.postgres.aggregates import ArrayAgg
    
    Application.objects.annotate(
        score_array=ArrayAgg('judge__total_score')
    )

    所以这不需要 SubQuery .