1

我在使用 'aggregate' 和 'latest' 时遇到了困难。

我有这两个模型:

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(基于 Field whensuccess值为 True 的所有对象。

4

1 回答 1

2

这应该有效:

from django.db.models import Max, F

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

首先,每个Word都用最近(即)尝试的日期进行注释。Max然后Word过滤对象以仅包括具有匹配Attemptwhere successisTrue和 where 日期与最新日期匹配的对象。(F用于表示另一列的值——或者在这种情况下,一个注释。)

于 2014-09-27T16:31:08.403 回答