2011-03-03 87 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