2011-04-18 56 views
1

我有這樣一個模型:Django的查詢集選擇平均和最好的結果

class Quiz(models.Model): 
    user = models.ForeignKey(User, unique=True) 
    school_class = models.CharField(max_length=3, choices=klasa_choices) 
    points = models.DecimalField(max_digits=5, decimal_places=2,default=0) 
    date = models.DateTimeField(null=True,blank=True) 
    active = models.BooleanField(default=False) 

基本上我想獲得的平均分(點),併爲每個school_class相應的用戶最好的結果。這可以輕鬆完成嗎? (即無需額外計算?)

到目前爲止,我來:

Quiz.objects.values('school_class').annotate(avg=Avg('points'),max=Max('points')).order_by('-avg') 

,但我怎麼也得最好的成績用戶?

+0

我不認爲這是可能的在同一個查詢。 – vartec 2011-04-18 22:44:47

+0

第二個查詢將如何看起來像那樣?到目前爲止,我有'Quiz.objects.all()。values(「user」,「school_class」)。order_by(' - points')' 我該如何才能使這個返回最好? – Robus 2011-04-18 22:46:06

+0

用戶從給定的類Quiz.objects.get(school_class = school_class,points = max)'具有最大分數(您從之前的查詢中得到)。然而,問題在於可能有多個最大分數,那麼應該使用'.filter()'而不是'.get()'。 – vartec 2011-04-18 22:50:33

回答

0

您需要第二個查詢。您可以使用第一個結果,以節省您的訂購表格:

quizzes = Quiz.objects.values('school_class').annotate(avg=Avg('points'),max=Max('points')).order_by('-avg') 

Quiz.objects.values('user','school_class').filter(points=quizzes.max) 

如果你只想要一個,加.latest(「日期」),.latest(「 - 日期」),或[0 ]得到一個。