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

zyk*_*yks 10 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'))
)
Run Code Online (Sandbox Code Playgroud)

我正在考虑将所有这些id与一些分隔符连接起来,但我不知道相应的函数.另一个解决方案是使list_field成为a queryset.我知道这种语法错了.感谢您的任何帮助.

AKS*_*AKS 15

如果您正在使用postgresql和django >= 1.9,您可以使用postgres特定的聚合函数,例如 ArrayAgg:

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

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


zyk*_*yks 5

我做了这样的事情:

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")
        ))
    )
Run Code Online (Sandbox Code Playgroud)

现在有列表None或pk下的每个field_a,field_b并field_c在查询集的每一个对象。您也可以定义其他默认值Case来代替None。

  • 是否可以从数组字段中过滤出无项目? (2认同)
  • `field_a=ArrayAgg("related_model__pk", filter=Q(related_model__field="A"))` 更干净一些。但是,我不确定发布此答案时“ArrayAgg”是否支持“filter”。 (2认同)