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
。我知道这个语法是错误的。感谢您的帮助。
如果您使用 postgresql
和 django >= 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_a
、field_b
和 field_c
下都有 None
或 pk
的列表。您还可以为 Case
定义其他默认值,而不是 None
.
我正在尝试使用 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
。我知道这个语法是错误的。感谢您的帮助。
如果您使用 postgresql
和 django >= 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_a
、field_b
和 field_c
下都有 None
或 pk
的列表。您还可以为 Case
定义其他默认值,而不是 None
.