2017-04-04 66 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定義其他默認值。