2017-02-13 57 views
0

我想在這裏提及這個我的其他Question SO,所以我試圖顯示每月的價格和12個月的表格,每個月總計項目收入一排,所以我已經成功地計算出使用Django每月註釋價格

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

我可以在表中顯示我的數據,只是讓總爲一排,但你可以從我剛纔的問題看,我想每月標註這是我的價格,創建一個表格,然後顯示總月份,但我真的很難理解如何從數據庫中提取此數據,因此在django==1.8+中這樣做的正確方法是什麼?我發現在最近的版本中他們加了Extract,但我不能在1.8中使用它,第二件事是django extra他們在這裏說Use this method as a last resort,所以你能解釋我怎麼做這個工作。

+0

檢索每月的價格你爲什麼不使用一個表有兩列,一爲一個月,一個價格。然後您可以簡單地按月選擇價格。 –

+0

我正在使用類似的東西,但我很難從數據庫提取飛蛾,可以做一個小例子? – PetarP

+0

假設你的模型被稱爲'價格',並且有兩個字段'month'和'price',那麼你可以做'ppm = Price.objects.filter(month = 1)[0]'。 'ppm.price'然後給你實際價格。 –

回答

1

我的建議是你添加一個字段到你的模型中,因爲它不可能在.values_list中使用__month。在註解之前,可以使用Values_list對查詢進行分組。

字段可能類似。

year_month = models.CharField(index=True) 

你可以改寫你的模型的保存方法和做類似

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) 

現在它可以註釋你的價格。

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

如果您需要更多信息,我相信您可以擴大values_list。

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

在沒有添加字段的情況下這樣做是可能的。假設你想過去的一年。

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

好吧,是否值得通過* hand *來執行這個計算,在我的ListView中使用iterator(),而不是在'models.py'中添加新字段,這個我很有趣,不過我會嘗試一下,只是想知道這個更多的python方式每月計算價格 – PetarP

+0

我對這個模板使用通用的'ListView',所以我可以做一個'mixin'並做這個計算 – PetarP

+0

永遠不會使用'ListView',也永遠不會聽說Django中有一個mixin,但很高興我的回答幫助你。 – Blackeagle52

0

說你的模型被稱爲Prices,有兩個領域dateprice其中date是時間字段。然後,您可以使用date__month(注意雙下劃線)作爲查詢方法的關鍵字參數(請參閱文檔field lookups)。

您可以通過

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