2016-08-19 2 views
0

Es ist wahrscheinlich der Titel könnte besser formuliert werden, aber ich kämpfe mit ihm.Django - Schleife durch zwei Abfragen für die gleichen Daten und Hinzufügen Kostenfeld für jede

Im Grunde versuche ich, die Kosten von Schaltungen pro Seite von meinen Modellen auszugleichen. das Schaltungsmodell inherts das Geländemodell nach unten:

Modellen:

class ShowroomConfigData(models.Model): 
    location = models.CharField(max_length=50) 

class CircuitInfoData(models.Model):  
    showroom_config_data = models.ForeignKey(ShowroomConfigData,verbose_name="Install Showroom") 
    major_site_info = models.ForeignKey(MajorSiteInfoData,verbose_name="Install Site") 
    circuit_type = models.CharField(max_length=100,choices=settings.CIRCUIT_CHOICES)  
    circuit_speed = models.IntegerField(blank=True) 
    cost_per_month = models.DecimalField(decimal_places=2,max_digits=8) 

, wie dies wahrscheinlich mit Abfragen durchgeführt werden kann, aber in einer durchlässigen Frage versuchte ive und es scheint, einen Fehler ive trifft so im Versuch, tun es manuell

Beispieldaten:

site a | 1 
site a | 2 
site a | 5 
site b | 100 
site b | 2 
site d | 666 
site d | 1  

so will ich

produzieren

Website a | 8 Website b | 102 Website d | 667

Ich habe versucht, auf diese Weise als Test:

circuits = CircuitInfoData.objects.all() 
showrooms = ShowroomConfigData.objects.only('location') 

for sdata in showrooms: 
    for cdata in circuits: 
     while cdata.showroom_config_data.location == sdata.location: 
     print sdata.location 
     print cdata.cost 

dies aus die Seite a und 8 x Höhe der Zeit nur aufgewühlt hat. also weiß ich nicht, wie ich das stattdessen tun sollte?

Dank

Antwort

1

Der effizienteste Weg, dies zu tun Abfragen verwendet. Dies kann annotations Verwendung erreicht werden, auf folgende Weise:

from django.db.models import Sum 
CircuitInfoData.objects.values("showroom_config_data__location") \ 
         .annotate(cost=Sum("cost_per_month")) 

Z.B. diese werden die Daten in Form zurückkehren

[{'showroom_config_data__location': u'site a', 'cost': Decimal('30.00')}, 
{'showroom_config_data__location': u'site b', 'cost': Decimal('5.00')}] 

Sie dann diese Ausgabe

for entry in output: 
    print entry["showroom_config_data__location"], " | ", entry["cost"] 

formatieren

site a | 30.00 
site b | 5.00 
+0

hallo diese returns site a | 1, Website a | 12, Standort a | 3 und so weiter, es wird nicht summiert, wo der Ort der gleiche ist ... – AlexW

+0

behoben, ich hatte dies in dem Modell, das alle Arten von Problemen verursacht hat ordering = ('showroom_config_data__location', 'circuit_speed') – AlexW

0

Was passiert, wenn Sie nur ein Wörterbuch zu gewöhnen? Jeder Kreis hat Zugang zum Showroom, oder? Wenn Sie also ein Wörterbuch erstellt haben und den Wert an einer bestimmten Site einfach herausgezogen haben, wenn dieser bereits als Schlüssel verwendet wird, können Sie den Wert einfach hinzufügen und erneut speichern. Hier ist ein Beispiel dafür.

Kann nicht genau funktionieren, aber das Konzept hinter dem Code wird Ihnen die gewünschte Ausgabe geben, die Sie suchen.