2017-04-04 95 views
1

我试图使用Django注释来创建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。我知道这个语法是错误的。感谢您的任何帮助。

+0

您正在使用哪个数据库? – AKS

+0

我正在使用psql – zyks

回答

4

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

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

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

+0

谢谢,它的工作原理:) – zyks

+0

你能解决聚合内的条件表达式吗?我想知道如何。 – AKS

+0

看到我下面的评论 – zyks

2

我做了这样的事情:

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

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