Django 查询集注释字段为 list/queryset

Django queryset annotate field to be a list/queryset

我正在尝试使用 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。我知道这个语法是错误的。感谢您的帮助。

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

Returns a list of values, including nulls, concatenated into an array.

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

我做过类似的事情:

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

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