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

Python Django queryset注释字段为列表/查询集,python,django,django-queryset,django-annotate,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')) ) 我想用一些分隔符

我试图使用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,但我不知道合适的函数。另一种解决方案是将列表字段设置为
queryset
。我知道这个语法是错误的。谢谢您的帮助。

如果您使用的是
postgresql
django>=1.9
,您可以使用postgres特有的聚合功能,例如。 :

返回连接到数组中的值(包括空值)列表


在这种情况下,您需要使用分隔符连接这些值,您也可以使用。

我做过类似的操作:

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

现在,queryset中每个对象的
字段a
字段b
字段c
下都有
None
pk
列表。您还可以为
Case
定义其他默认值,而不是
None

您使用的是哪个数据库?我使用的是psql您是否能够在聚合中计算出条件表达式?我想知道怎么做。看看下面我的评论,看看我遗漏了什么。我当时使用的是
then=F(“related\u model\uu pk”)
,这就是它不起作用的原因。谢谢。我怎样才能使它成为一组值呢?是否可以从数组字段中过滤掉“无”项?我已经在应用程序中使用python
filter
函数过滤掉了它们。我不确定这在数据库级别是否可行。
field\u a=ArrayAgg(“related\u model\u pk”,filter=Q(related\u model\u field=“a”)
更干净一些。但是,我不确定发布此答案时,
ArrayAgg
是否支持
filter