Django queryset注释字段为列表/查询集

时间:2017-04-04 09:17:30

标签: python django django-queryset django-annotate

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

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。我知道这种语法错了。谢谢你的帮助。

2 个答案:

答案 0 :(得分:12)

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

  

返回一个值列表,包括连接成数组的空值。

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

答案 1 :(得分:3)

我做过类似的事情:

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")
        ))
    )

现在,对于查询集中的每个对象,每个Nonepkfield_a下都有field_bfield_c列表。您还可以为Case而不是None定义其他默认值。