2011-04-18 53 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 ]得到一个。