2012-11-18 38 views
2

考慮以下型號的最新資料:有效地選擇不同類別

class Data(Model): 
     created_at = models.DateTimeField() 
     category = models.CharField(max_length=7) 

我想選擇所有類別的最新對象。

this question,我選擇了不同的類別,然後製作一個單獨的查詢爲他們每個人:

categories = Data.objects.distinct('category').values_list('category', flat=True) 
    for category in categories: 
     latest_obj = Data.objects.filter(category=category).latest('created_at') 

這種方法的缺點是,它使大量的查詢(1爲不同的類別,然後對每個類別單獨查詢)。

有沒有辦法用單個查詢來做到這一點?

+0

如果你不打算有一個分離的類別模型,你可以將Data.objects.all()分配給一個變量並運行一個函數來檢索每個類別的最新數據,這只是一個查詢 –

+0

順便說一句,縮短你的當前代碼使用一個單獨的分類模型: '最新的obj = obj.data_set.latest()爲obj在Category.objects.all()如果obj.data_set.count()]' –

回答

0

通常,您可以在關係數據庫中使用組。 Django的有aggergation API (https://docs.djangoproject.com/en/dev/topics/db/aggregation/#aggregation),它可以讓你做到以下幾點:

from django.db.models import Max 
Data.objects.values('category').annotate(latest=Max('created_at')) 

這將執行單查詢並返回像這樣的列表:

[{'category' : 'cat1', 'latest' : '01/01/01' },{'category' : 'cat2' 'latest' : '02/02/02' }] 

但我猜你可能要檢索的數據記錄ID,以及這個名單之內。在這種情況下,Django不會讓你覺得簡單。問題是django使用value子句中的所有字段進行分組,並且不能從查詢中返回多餘的列。

編輯:我最初建議基於Web資源添加第二個values()子句到查詢的末尾,但是這不會爲結果集添加額外的列。