15

我正在尝试使用 django 注释来创建查询集字段,该字段是一些相关模型属性的值列表。

queryset = ...
qs = queryset.annotate(
    list_field=SomeAggregateFunction(
        Case(When(related_model__field="abc"), then="related_model__id")
    ),
    list_elements=Count(F('list_field'))
)

我正在考虑将所有这些 id 与一些分隔符连接起来,但我不知道合适的功能。另一种解决方案是使 list_field 成为queryset. 我知道这种语法是错误的。感谢您的任何帮助。

4

2 回答 2

18

如果您使用postgresqland django >= 1.9,您可以使用 postgres 特定的聚合函数,例如 ArrayAgg

返回连接到数组中的值列表,包括空值。

如果您需要使用分隔符连接这些值,您也可以使用StringAgg.

于 2017-04-04T10:27:21.867 回答
6

我做过类似的事情:

qs = queryset \
    .annotate(
        field_a=ArrayAgg(Case(When(
            related_model__field="A",
            then="related_model__pk")
        )),
        field_b=ArrayAgg(Case(When(
            related_model__field="B",
            then="related_model__pk")
        )),
        field_c=ArrayAgg(Case(When(
            related_model__field="C",
            then="related_model__pk")
        ))
    )

现在每个Nonepk下都有列表field_afield_b以及field_c查询集中的每个对象。您还可以为Case代替定义其他默认值None

于 2017-04-06T05:50:45.160 回答