2017-04-26 7 views
0

ich habe:Python verschachtelte Schleife berechnet Summe

models.py

class Plant(models.Model): 
    plant_name = models.CharField() 
    multiplier = no_recording = models.PositiveIntegerField(default=1) 

class Recording(models.Model) 
    plant = models.ForeignKey(Plant, on_delete=models.CASCADE) 
    no_recording = models.PositiveIntegerField(default=1) 

    def x(self): 
     return self.no_recording*self.plant.multiplier 

ich brauche: die Summe von x für jede Pflanze. Was ich aus meiner Sicht versucht habe, ist dies, tut es aber nicht. Ich erhalte die Objekt ‚Aufnahme‘ hat kein Attribut ‚Aggregat‘

views.py

def home(request): 
    plants = Plant.objects.all() 
    total_recording_per_plant = [] 
    for plant in plants 
     for recording in plant.recording_set.all(): 
     total_recording_per_plant.append(recording.aggregate(sum=Sum('x'))) 

aber ich erhalte die ‚Aufnahme‘ Objekt kein Attribut ‚Aggregat‘

Antwort

0

Sie können nur Wenden Sie Aggregationen auf Dinge an, die Datenbankfelder sind. x wie definiert haben, ist eine Methode auf dem Modell.

Recording.objects.values("plant").annotate(
    agg=Sum(F("no_recording")*F("plant__multiplier"), 
    output_field=FloatField()) 
) 

die sollte Gruppe von Pflanzen-ID die annotate die queryset mit der Summe von no_recording * plant__multplier

See: https://docs.djangoproject.com/en/1.11/topics/db/aggregation/#cheat-sheet

+0

erhalte ich: ' 'Wie kann ich nur die Summe bekommen ?? – George

+0

Von all den Dingen? Dann entfernen Sie die Werte (Pflanze) – wrdeman

+0

meine ** views.py ** 'def home (Anfrage): Pflanzen = Plant.objects.all() total_recording_per_plant = [] für Anlage in Pflanzen total_recording_per_plant = Recording.Objects. Werte ("Pflanze"). Annotate (Summe = Summe (F ("no_recording") * F ("plant__multiplier"))) ** und in meiner HTML-Vorlage ** '{% für Pflanze in Pflanzen%} total_recording_per_plant} } {% endfor%} 'und ich bekomme, was ich in meinem ersten Kommentar geschrieben habe – George

Verwandte Themen