2017-04-04 7 views
1

Ich versuche, Django Annotation zu verwenden, um Abfragefeld zu erstellen, das eine Liste der Werte einiger verwandter Modellattribute ist.Django Query Set Annotate Feld zu einer Liste/queryset

Ich dachte über die Verkettung all dieser ID mit einem Trennzeichen nach, aber ich kenne die entsprechenden Funktionen nicht. Eine andere Lösung besteht darin, list_field zu queryset zu machen. Ich weiß, dass diese Syntax falsch ist. Danke für jede Hilfe.

+0

Welche Datenbank verwenden Sie? – AKS

+0

Ich benutze psql – zyks

Antwort

4

Wenn Sie postgresql und django >= 1.9 verwenden, können Sie Postgres spezifische Aggregationsfunktionen verwenden, z. ArrayAgg:

Gibt eine Liste von Werten, einschließlich nulls, in eine Anordnung verkettet.

Falls Sie diese Werte mit einem Trennzeichen verketten müssen, können Sie auch StringAgg verwenden.

+0

Vielen Dank, es funktioniert :) – zyks

+0

Konnten Sie den bedingten Ausdruck innerhalb der Aggregation erarbeiten? Ich würde gerne wissen wie. – AKS

+0

Siehe meinen Kommentar unter – zyks

2

Ich habe so etwas getan:

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

Nun gibt es Listen von None oder pk unter jedem field_a, field_b und field_c für jedes Objekt in queryset. Sie können auch einen anderen Standardwert für Case anstelle von None definieren.

Verwandte Themen