Django用于另一个模型的不同外键

时间:2011-03-03 22:23:41

标签: django django-models foreign-keys distinct

class Log:
  project = ForeignKey(Project)
  msg = CharField(...)
  date = DateField(...)

我想选择四个最新的日志条目,其中每个日志条目必须具有唯一的项目外键。我在谷歌搜索上尝试过这些解决方案但是它们都没有用,而且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中的对象顺序不同,因为当您使用Mysql函数IN()时,它不会按输入顺序对结果进行排序...如何在django中执行此操作?< / p>

3 个答案:

答案 0 :(得分:0)

看起来用django orm实现你想要的东西是不可能的。文档说明不可能使用order_by和distinct。

然而,可能有另一种解决方法。也许您可以选择Project对象,并使用最新的日志条目对它们进行注释。

答案 1 :(得分: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]

答案 2 :(得分:0)

这是一个单一查询解决方案(但可能会太慢):

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

相关问题