2010-10-07 23 views
0

我很難把這個Django查詢包裹起來。我可能可以用SQL(也許我必須)弄清楚這一點,但我想知道是否有辦法用Django對象來做到這一點。用戶的所有最近添加的量的只對最近添加的記錄進行求和

class Stat(model.Models): 
    entry_date = models.DateTimeField() 
    quantity = models.PositiveIntegerField() 
    user = models.ForeignKey(User) 

我需要返回的總和(使用註釋和和,我猜):

這個模型看起來像這樣(簡化爲清楚起見) ,按月分組。這有點難以解釋,但數量不是累積的 - 我只需要處理給定用戶和給定月份的最新記錄,然後我需要對這些數量進行求和,並按月對它們進行分組。如果需要更多解釋,請說出來。

更新:

下面是一些粗糙的psudo代碼,根據要求。這段代碼並不一定是我所期待的,但大概是我可以做的,但是以一種緩慢的,程序化的方式。爲了速度,我希望有一種方法可以通過單個查詢來實現。 (順便說一句,這是基於以下的馬諾Govindan的代碼。)

year = list_of_months_that_have_stats 
users = all_users_in_database 
for months in year: 
    for user in users: 
     sum = Stat.object.filter(user=user, entry_date__month=month).order_by('-entry_date')[0].aggregate(sum=Sum('quantity')) 
     final_output[month] = sum 

同樣,我試圖獲得最後的戰績爲給定月份通知。我正在用order_by做這件事,但據我所知,這不起作用 - 這只是一個例子。

當然,上面的代碼不起作用。謎題的缺失部分是降序order_by,它只獲取查詢中的第一項。

+0

你能提供一些僞代碼來說明你期望過程的樣子嗎? – Woot4Moo 2010-10-07 16:20:00

+0

在僞代碼中描述有點困難,因爲我真的不知道如何處理它,但我會嘗試。我會更新主帖。 – 2010-10-08 18:51:58

回答

1

我不知道我確切地理解你想要什麼。看到我的答案,並糾正我,如果我沒有得到它的權利。

我只需要處理最近的記錄爲給定用戶和給定月份,然後我需要總結的數量和他們組由一個月。

(強調添加)。如果這是您需要的,那麼您可以使用filteraggregate的組合,如下所示。

from django.db.models import Sum 
q = Stat.objects.filter(user = user, entry_date__month = 10).aggregate(
    sum = Sum('quantity')) 
print q 
# {'sum': 14} 

的過濾條件,確保您擁有所需的user,而且entry_datemonth部分需要的月份相匹配(在這種情況下,十月,因此10)。然後您可以爲用戶/月份組合的數量Sum

更新

如果你想每每個月的用戶總和(我在這裏猜測,這是你說的「按月它們組合」的意思),那麼你可以嘗試這樣的事情:

select = dict(month = 'extract(month from entry_date)') 
q = Stat.objects.filter(user = user).extra(
     select = select).values('month').annotate(
     sum = Sum('quantity')) 

print q 
# [{'sum': 14, 'month': 10.0}, {'sum': 6, 'month': 9.0}] 

這是一個快速解釋。

  1. extra用於指定要從日期中提取月份部分。這是數據庫特定的。在我的情況下,語法extract(month from entry_date)特定於Postgresql。

  2. 使用values提及您只需要month。這個很重要。如果省略values部分,則所有字段都將被提取,您將無法獲得所需的效果。

  3. 最後annotate每個記錄與Sum('quantity')。這將返回每個月的總和。

+0

感謝您的回答。這或多或少是我所需要的,除了一個很大的區別:我需要添加最後一個記錄,而不僅僅是具有特定日期的記錄。因此,對於8月份,我需要某個用戶添加的最新記錄。 9月份我需要同樣的東西。再次,這很難解釋,但感謝您的幫助意願。 – 2010-10-08 18:51:39

+0

爲了進一步解釋,我所說的「最後添加的記錄」實際上是最近的記錄。基本上.order_by(' - entry_date')[0],如果你明白我的意思。 – 2010-10-08 19:09:32