我正在尝试使用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
。我知道这种语法错了。谢谢你的帮助。
答案 0 :(得分:12)
如果您使用postgresql
和django >= 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")
))
)
现在,对于查询集中的每个对象,每个None
,pk
和field_a
下都有field_b
或field_c
列表。您还可以为Case
而不是None
定义其他默认值。