2013-01-08 120 views
2

我認爲很多類似的問題已經被問到,但我無法制作複製粘貼解決方案。所以這裏是問題:獲取最新對象django

我定期計算我的用戶數據分析報告。我編寫了一個模型將這些計算存儲在我的sqlite數據庫中。

class report_data(models.Model): 
    name = models.TextField() 
    matrix = PickledObjectField() 
    creation_date = models.DateTimeField('date of creation') 

我使用一個只計劃,堅持歷史數據,所以有很多的記錄在數據庫中,有

  • 同名
  • 不同的矩陣
  • 不同的創建日期

我的報告查看現在需要一個集合,其中包含該記錄最近的創建日期和唯一的名字。不幸的是sqlite不支持DISTINCT ON,我找到的解決方案here,不能確定,它總是最近的矩陣,是嗎?

report_data.objects.all().distinct() 

也不管用,因爲這些記錄都是通過那裏的鍵來區分的。除了

report_data.objects.all().latest("creation_date") 

不起作用,因爲它不只是沒有考慮到name列返回一個最新的元素。

我在Django相當初學者,在SQL我會嘗試像

SELECT max(date),name,matrix FROM report_data group by name 

,但我沒有測試過這一點。

編輯:

通過支持註釋討論我提出了某種形式的解決方案,它看起來像這樣:

a = report_data.objects.values('name').annotate(latest=Max('creation_date')) 

然後,我得到了所有正確的創建日期,但如何獲得註釋的對象?

EDIT2:

現在我用一個ReportManager,看起來像這樣:

class ReportManager(models.Manager): 
    def recent(self): 
     a = report_data.objects.values("name").annotate(latest_id=Max('id')) 
     a = list(v['latest_id'] for v in a) 
     return report_data.objects.filter(id__in=a).order_by('-creation_date') 

但我不是這種解決方案非常高興。感謝您發佈真實解決方案!

+0

您是否找到針對此問題的其他解決方案?如果'a'很大,過濾器(id__in = a)可能會變得混亂。 –

回答

0

您是在查找Max

from django.db.models import Max # also available: Q, Count, Min, Sum, Avg, StdDev, Variance, ... 
report_data.objects.all().aggregate(Max('creation_date')) 
+0

這太棒了!這幾乎是我正在尋找的。這將返回最大值,而不是對象本身。這也在這裏討論:http://stackoverflow.com/questions/844591/how-to-do-a-select-max-in-django,但是'a = report_data.objects.all()。aggregate(Max ('creation_date')); result = report_data。objects.get(creation_date = a)'一個好的解決方案?我認爲這是不確定的,它總是返回相同的.. –