2014-09-27 33 views
0

我遇到了'聚合'和'最新'的困難。Django - 「查找所有行的最新」兒童

我有這兩種模式:

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

這應該工作:

from django.db.models import Max, F 

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

首先,每Wordannotated與最近的日期(即Max)的嘗試。然後,Word對象將被過濾爲僅包含具有匹配的Attempt,其中successTrue,並且日期與最新日期匹配。 (F用於表示另一列的值(在本例中爲註釋)。

+0

謝謝凱文。對不起,我花了這麼長時間才承認,但實際上我花了一點時間才弄清楚所產生的答案是否確實是正確的!我的下一個任務是更好地理解*爲什麼*它有效;-)。再次感謝。 – glaucon 2014-09-29 03:52:16

+0

@glaucon:不客氣。我添加了一個解釋,希望更清楚。如果你按照鏈接閱讀關於註釋和F對象,我認爲這是有道理的。 – 2014-09-29 16:08:49