2010-07-05 79 views
1

我有一個模型,它看起來像這樣:聚集和額外的價值和Django

class MyModel(models.Model) 
    value = models.DecimalField() 
    date = models.DatetimeField() 

我在做這個請求:

MyModel.objects.aggregate(Min("value")) 

,我得到預期的結果:

{"mymodel__min": the_actual_minimum_value} 

但是,我不能找出一種方法來同時獲得最小值和相關的日期(mi發生最小值)。

Django ORM是否允許這樣做,還是我必須使用原始SQL?

回答

2

你想要做的是註釋查詢,這樣你就可以恢復通常的結果,但也會將一些數據添加到結果中。所以:

MyModel.objects.annotate(Min("value")) 

將與mymodel__min返回正常的結果作爲附加價值

在回答您的意見,我覺得這是你在找什麼?這將以相應的最小值返回日期。

MyModel.objects.values('date').annotate(Min("value")) 

編輯:在進一步回答您的評論你想要的最低值入境,但也希望你的結果中附加日期字段,你可以不喜歡這樣:

MyModel.objects.values('date').annotate(min_value=Min('value')).order_by('min_value')[0] 

這將通過對結果進行排序得到最終的字典,然後簡單地將第一個索引始終作爲最低值。 見more

+0

糾正我,如果我錯了,但: 與註釋,該查詢集將返回我所有的模型實例,每個實例的「mymodel__min」屬性。 它不會告訴我在哪一天發生的最小值(除非手動比較,對於每個返回的價格,將值設置爲最小值並選擇匹配的日期)。 – Jeremy 2010-07-05 20:13:36

+0

你是對的。對不起,我沒有意識到這也是你問題的一部分。我調整了我的問題,所以你可以按日期分組,這似乎是你想要的,是的? – Bartek 2010-07-05 20:18:35

+0

使用'annotate'將返回所有MyModel實例。我只對其值爲最小值的實例感興趣,並獲得它的日期。 隨着你的新請求,我得到一個列表,每個列表都有不同的日期和不同的最小值(實際上對應於每個模型實例中的值和日期)。 – Jeremy 2010-07-05 20:37:45