Django - 所有行的“查找最新”子项

时间:2014-09-27 11:52:56

标签: django django-models django-1.7

我在'聚合'和'最新'方面遇到了困难。

我有这两个模型:

class Word(models.Model):
    ESSENTIALWORDS = 'EW'
    FOOB = 'ER'
    OTHER = 'OT'
    WORDSOURCE_TYPE_CHOICES = (
        (ESSENTIALWORDS, 'Essential Words'),
        (FOOB, 'FOOB'),
        (OTHER, 'OTHER'),
    )

    level = models.IntegerField()
    word = models.CharField(max_length=30)
    source = models.CharField(max_length=2,
                              choices=WORDSOURCE_TYPE_CHOICES,
                              default=OTHER)
    hint = models.CharField(max_length=30, null=True, blank=True)


class Attempt(models.Model):
    learner = models.ForeignKey(Learner)
    word = models.ForeignKey(Word)
    when = models.DateTimeField(auto_now_add=True)
    success = models.BooleanField(default=False)

我想查找最新Word(基于字段Attempt)的when值为True的所有success个对象。

1 个答案:

答案 0 :(得分:1)

这应该有效:

from django.db.models import Max, F

Word.objects.annotate(latest=Max('attempt__when'))
            .filter(attempt__success=True,
                    attempt__when=F('latest'))

首先,每个Word都是annotated,其中包含最近一次(即Max)尝试的日期。然后,Word对象将被过滤为仅包含匹配AttemptsuccessTrue且日期与最新日期匹配的对象。 (F用于表示另一列的值 - 或者在本例中为注释。)