2016-01-13 3 views
5

Angenommen, es eine Struktur ist wie folgt:Django mit Anmerkungen versehen queryset auf einem bestimmten Wert des relationalen Modells Attribut

PARTICIPATION_STATUSES = (
    (0, 'No, thanks'), 
    (1, 'I may attend'), 
    (2, 'I\'ll be there'), 
) 

class Model1(models.Model): 
    # ... 

class Model2(models.Model): 
    status = models.PositiveIntegerField(
     _('participation status'), choices=PARTICIPATION_STATUSES)  
    field = models.ForeignKey(Model1, related_name='model1_participation') 

Was ich tun möchte, ist jedes Objekt von Model1 mit der Zählung der Model2 Objekte mit Anmerkungen versehen, wo Status a gleich spezifischer Wert (Statusnummer ist dieses spezielle Beispiel).

In meinem Pseudo-Code würde es wie folgt aussehen:

queryset = Model1.objects.all() 
queryset.annotate(declined=Count('model1_participation__status=0')) 
queryset.annotate(not_sure=Count('model1_participation__status=1')) 
queryset.annotate(accepted=Count('model1_participation__status=2')) 

Aber ich kann den queryset auf diese Weise nicht mit Anmerkungen versehen, wie Django nicht status=<n> lösen.

Was ist der richtige Weg, um zu erreichen, was ich will?

Antwort

6

Wenn Sie Django 1.8 oder höher verwenden, können Sie Conditional Aggregations verwenden, diese sollten für annotate Querysets funktionieren.

from django.db.models import IntegerField, Case, When, Count 


queryset = Model1.objects.all() 

queryset = queryset.annotate(
    declined=Count(
     Case(When(model1_participation__status=0, then=1), 
      output_field=IntegerField()) 
    ), 
    not_sure=Count(
     Case(When(model1_participation__status=1, then=1), 
      output_field=IntegerField()) 
    ), 
    accepted=Count(
     Case(When(model1_participation__status=2, then=1), 
      output_field=IntegerField()) 
    ) 
) 
+0

Danke, das sieht wirklich gut aus, aber ich muss Objekte annotieren und nicht aggregieren. Haben Sie Ideen zu Annotationen wie diesen? – pythad

+0

Ich habe die Antwort geändert, es sollte immer noch genauso funktionieren. Probieren Sie es aus und lassen Sie mich wissen, wie es geht! –

+0

Angesichts der Modelle glaube ich nicht, dass "field_set" der richtige Name ist ('_set' wird für Objekte verwendet, d. H. Um die zugehörigen Datensätze einer bestimmten Instanz abzurufen). Verwenden Sie 'When (model2__status == ...' eher – Pynchia

Verwandte Themen