2013-04-07 49 views
0

我有一个Django查询,我想组测试尝试通过为test_id次数并获得每次测试之间的平均值。Django查询:你可以嵌套注释吗?

的test_attempts表记录每个测试尝试在用户在给定的测试。我想找到每个测试

这里尝试的平均数量是我的查询:

average = TestAttempts.objects.values('test_id').annotate(Avg(Count('test_id'))).filter(user_id=id) 

我收到以下错误: “伯爵”对象有没有属性“分裂”

有没有办法处理这个,而不必写入原始的SQL?

UPDATE: 这里是TestAttemt模型

class TestAttempts(models.Model): 
id = models.IntegerField(primary_key=True) 
user_id = models.IntegerField() 
test_id = models.IntegerField() 
test_grade = models.DecimalField(max_digits=6, decimal_places=1) 
grade_date_time = models.DateTimeField() 
start_time = models.DateTimeField() 
seconds_taken = models.IntegerField() 
taking_for_ce_credit = models.IntegerField() 
ip_address = models.CharField(max_length=25L) 
grade_points = models.DecimalField(null=True, max_digits=4, decimal_places=1, blank=True) 
passing_percentage = models.IntegerField(null=True, blank=True) 
passed = models.IntegerField() 
class Meta: 
    db_table = 'test_attempts' 

回答

0

你想一个数字,尝试在所有测试的平均值是多少?你有测试模型吗?

这会对你有帮助:

average = (Test.objects.filter(testattempt__user_id=id) 
      .annotate(c=Count('testattempt')) 
      .aggregate(a=Avg('c'))['a']) 

 

如果没有TestAttempt →测试的关系,但只有为test_id场,那么这应该工作:

average = (TestAttempt.objects.filter(user_id=2) 
           .values('test_id') 
           .annotate(c=Count('pk')) 
           .aggregate(a=Avg('c'))) 

但对我不起作用的sqlite的,我不手边有一个适当的分贝。

+0

这正是我正在寻找的,再次感谢您的帮助,我花了大量时间翻阅文档,没有运气 – xXPhenom22Xx 2013-04-07 20:40:16

+0

TestAttempt表与测试表没有PK或关系。当我尝试使用第二个选项,因为它通过为test_id看起来组第一,然后计数和平均值我得到一个SQL错误? (1064,“您的SQL语法错误;检查对应于你的MySQL服务器版本由于使用接近”正确的语法手册(SELECT'test_attempts'.'test_id' AS'test_id',COUNT( 'test_attempts'.'id')”第1" 行) – xXPhenom22Xx 2013-04-07 21:55:33

+0

这感觉就像在Django的错误:(你能不能把你的模型,你的问题? – 2013-04-07 22:00:44