2017-02-13 3 views
0

Ich möchte dies auf meine andere Question hier auf SO verweisen, so versuche ich, den Preis pro Monat anzuzeigen und eine Tabelle mit 12 Monaten, eine Zeile mit Gesamtprojekt Einkommen pro Monat, so dass ich erfolgreich berechnet für, dass mein Preis mitDjango Annotate Preis pro Monat

context["price_aux"] = Project.objects.annotate().aggregate(Sum("price_aux"))

ich meine Daten in einer Tabelle angezeigt werden können und nur eine Reihe von insgesamt machen, haben aber wie man aus meiner vorherigen Frage sehen möchte ich pro Monat zu annotieren und mache eine Tabelle und zeige dann den Gesamtwert für den Monat an, aber es fällt mir wirklich schwer zu verstehen, wie ich das aus meiner Datenbank extrahieren kann, also was ist der richtige Weg dafür in django==1.8+, sehe ich das in Aktuelle Version haben sie Extract hinzugefügt, aber ich kann es nicht in 1.8 verwenden, zweite Sache ist django extra sie hier Use this method as a last resort angegeben, so können Sie mir erklären, wie kann ich diese Arbeit machen.

+0

abrufen Warum Sie nicht über eine Tabelle mit zwei Spalten, eine für Monat und einem Preis nutzen. Dann können Sie einfach den Preis nach Monat auswählen. –

+0

Ich verwende so etwas, aber ich habe eine schwere Zeit, Motte aus db zu extrahieren, kann ein kleines Beispiel machen? – PetarP

+0

Angenommen, Ihr Modell heißt 'Prices' und hat zwei Felder' month' und 'price', dann tun Sie' ppm = Prices.objects.filter (month = 1) [0] '. "ppm.Preis" gibt Ihnen dann den tatsächlichen Preis. –

Antwort

1

Mein Vorschlag ist, dass Sie Ihrem Modell ein Feld hinzufügen, da es nicht möglich ist, __month in .values_list zu verwenden. Mit Values_list können Sie Ihre Abfragen vor der Annotation gruppieren.

Feld könnte etwas wie sein.

year_month = models.CharField(index=True) 

Sie könnten die Speichermethode auf dem Modell überschreiben und so etwas wie

def save(self, *args, **kwargs) 
    # Not sure if auto_add_now already set the value, could use timezone.now() 
    if not self.id: # thus not saved yet 
     self.year_month = self.created_at.strftime("%Y%m") 
    super(Model, self).save(*args, **kwargs) 

Nun ist es möglich, Ihre Preise zu annotieren.

Wenn Sie weitere Informationen benötigen, glaube ich, dass Sie die values_list erweitern könnten.

Project.objects.values_list('year_month').annotate(price_sum=Sum("price_aux")) \ 
    .values_list('name', 'year_month', 'price_sum') 

Es ist natürlich möglich, ohne Feld hinzufügen. Sagen wir, du willst das vergangene Jahr.

import datetime 
from django.utils import timezone 

def my_list_view(request): 
    end = timezone.now() 
    # note, could do some weird stuff in years with 366 days 
    begin = (end - datetime.timedelta(days=365)).replace(day=1) 

    container = {} 
    while begin < end: 
     container[begin.strftime("%Y%m")] = 0 
     begin = (begin + datetime.timedelta(weeks=5).replace(day=1) 

    for project in Project.objects.iterator(): 
     container[project.created_at.strftime("%Y%m")] += price 

    # Now you can render your template 
+0

Ok, lohnt es sich, diese Berechnung mit * hand * zu tun, indem ich iterator() in meiner' ListView' verwende und kein neues Feld in 'models.py' hinzufüge, das ist interessant, trotzdem werde ich es versuchen, ich Ich frage mich nur über diese mehr Python Art der Berechnung Preis pro Monat – PetarP

+0

Ich benutze generische 'ListView' für diese Vorlage, so kann ich vielleicht eine' mixin' machen und diese Berechnung – PetarP

+0

Nie verwendet 'ListView', auch nie Ich hörte von einem Mix in Django, aber ich bin froh, dass meine Antwort dir geholfen hat. – Blackeagle52

0

Sagen Sie Ihr Modell Prices genannt und hat zwei Felder date und price wo date ein Datetime-Feld ist. Dann können Sie date__month (beachten Sie den doppelten Unterstrich) als Schlüsselwortargument für Abfragemethoden verwenden (siehe die Dokumentation für field lookups).

Sie können den Preis für Monat über

Prices.objects.get(date__month=1).price