2011-03-03 49 views
1
class Log: 
    project = ForeignKey(Project) 
    msg = CharField(...) 
    date = DateField(...) 

我想選擇四個最近的日誌條目,其中每個日誌條目必須具有唯一的項目外鍵。我試着在谷歌搜索的解決方案,但他們沒有工作和Django文檔不是用於查找非常好的..在另一個模型中使用的Django獨特外鍵

我想:

id_list = Log.objects.order_by('-date').values_list('project_id').distinct()[:4] 
entries = Log.objects.filter(id__in=id_list) 

id_list是空的,除非我刪除ORDER_BY ()但是它沒有按照正確的順序。

entries = Log.objects.filter(id__in=id_list) 

的對象中的條目不相同的順序在id_list因爲當您使用IN(MySQL函數),它不會被輸入順序...如何做到這一點在Django的結果排序?

回答

0

它看起來是不可能達到你想要的與Django Orm。文檔指出,不可能使用order_by和distinct。

但是可能有另一種解決方法。也許你可以選擇Project對象,並用最新的日誌條目對它們進行註釋。

0

我認爲Skirmantas是正確的,你必須做一個更復雜的方式:

from django.db.models import Max 
projects = Project.objects.annotate(last_logged=Max('log__date')).order_by('-last_logged')[:4] 
log_entries = [proj.log_set.order_by('-date')[0] for proj in projects] 
+0

我得到:NameError at/ 全局名稱'Max'未定義? – mrmclovin 2011-03-09 12:23:23

+0

嘗試:'from django.db.models import Max' – 2011-03-09 18:40:49

+0

謝謝,但現在它說「列表索引超出範圍」@「log_entries = [proj.log_set.order_by(' - date')[0] for proj in項目]「 – mrmclovin 2011-04-19 14:30:08

0

這裏有一個單一查詢解決方案(但它可能會太慢):

Log.objects.filter(project__log__date__gte=F('date')).annotate(c=Count('project__log')).filter(c__lte=4).order_by('project', 'c')

+0

謝謝,我接近有效的解決方案。但是,如何將這與{%regroup%}模板標記一起使用?看起來排序不是按日期字段,而是按項目字段。 – mrmclovin 2011-04-27 09:07:23

+0

如何以及爲何要重組結果? – emulbreh 2011-04-27 11:48:30

+0

看,我想爲最多3個不同的項目選擇3個最近的日誌。當我將它們呈現在我的模板中時,我想將日誌對象放在項目訂購的每個項目下,這些項目最先得到最近的日誌。再次感謝你的幫助! – mrmclovin 2011-04-28 14:00:30

相關問題