Python Django queryset注释字段为列表/查询集
我试图使用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')) ) 我想用一些分隔符
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”)
,这就是它不起作用的原因。谢谢。我怎样才能使它成为一组值呢?是否可以从数组字段中过滤掉“无”项?我已经在应用程序中使用pythonfilter
函数过滤掉了它们。我不确定这在数据库级别是否可行。field\u a=ArrayAgg(“related\u model\u pk”,filter=Q(related\u model\u field=“a”)
更干净一些。但是,我不确定发布此答案时,ArrayAgg
是否支持filter
。