我認爲很多類似的問題已經被問到,但我無法制作複製粘貼解決方案。所以這裏是問題:獲取最新對象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')
但我不是這種解決方案非常高興。感謝您發佈真實解決方案!
您是否找到針對此問題的其他解決方案?如果'a'很大,過濾器(id__in = a)可能會變得混亂。 –