【问题标题】:Django - "Find latest" of children for all rowsDjango - 为所有行“查找最新”的孩子
【发布时间】:2014-09-27 11:52:55
【问题描述】:

我在使用“聚合”和“最新”时遇到了困难。

我有这两个模型:

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)

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

【问题讨论】:

    标签: django django-models django-1.7


    【解决方案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 对象被过滤为仅包含具有匹配Attempt 的对象,其中success 是True,并且日期与最新日期匹配。 (F 用于表示另一列的值——或者在本例中,是一个注解。)

    【讨论】:

    • 谢谢凯文。很抱歉我花了这么长时间才承认,但实际上我花了一点时间来确定所产生的答案是否确实是正确的!我的下一个任务是更好地理解为什么它有效;-)。再次感谢。
    • @glaucon:不客气。我添加了一个解释,希望让它更清楚。如果您点击链接并阅读有关注释和 F 对象的信息,我认为这是有道理的。
    猜你喜欢
    • 1970-01-01
    • 2011-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-11
    • 2018-01-29
    相关资源
    最近更新 更多