2013-04-07 78 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