2013-07-19 62 views
2

如果我有一個模型定義爲:Django的ORM:彙總註解引發DatabaseError

class Book(models.Model): 
    name = models.CharField(max_length=300) 
    pages = models.IntegerField() 
    price = models.DecimalField(max_digits=10, decimal_places=2) 
    rating = models.FloatField() 
    pubdate = models.DateField() 

,我運行查詢:

Book.objects.values('rating').annotate(books_per_rating=Count('id')).aggregate(Max('books_per_rating')) 

我得到一個DatabaseError。根據https://docs.djangoproject.com/en/1.5/topics/db/aggregation/#aggregating-annotations,Django支持聚合註釋。但是在鏈接本身給出的示例中,它們通過QuerySet進行了註釋,該查詢集依次返回QuerySet(而不是ValuesQuerySet),因此聚合方法成功運行。但在我的示例聚合ValuesQuerySet引發DatabaseError

這是Django中的錯誤嗎?因爲如果Django不支持聚合ValuesQuerySet那麼它應該在Django級別引發異常(而不是DatabaseError)。

更新

此bug已在這裏解決:https://code.djangoproject.com/ticket/20782

+0

也有趣的是,如果這樣做: 'Book.objects.values('rating')。aggregate(Max('rating'))' 它返回一個空的字典而不執行任何數據庫查詢! –

回答

1

看來,你已經遇到了一個錯誤。你應該在django trac instance上登錄。

具體說明您正在使用的是哪個數據庫後端。我現在正在對sqlite進行測試,因爲我目前沒有訪問不同的後端。我提到這一點是因爲我已經看到values().aggregate()在搜索這個問題的答案時使用的工具 - 所以它可能只是django使用的SQLite sql編譯器中的一個錯誤。

以下是我正在使用的測試以及生成的查詢的輸出。

>>> Stats.objects.values('created').annotate(num_days=Count('id')).aggregate(Max('num_days')) 
Traceback (most recent call last): 
DatabaseError: near "FROM": syntax error 
>>> print connection.queries[-1] 
{u'time': u'0.000', u'sql': u'SELECT FROM (SELECT "scratch_stats"."created" AS "created", COUNT("scratch_stats"."id") AS "num_days" FROM "scratch_stats" GROUP BY "scratch_stats"."created") subquery'} 

編輯:

只是試圖用Postgres的同樣的事情,而同樣的錯誤。出現不能使用aggregateValuesQuerySet

在django 1.4,1.5和1.6上失敗。

+1

如果你給我30分鐘,我會嘗試postgres –

+0

測試我正在使用postgres,但得到sqllit有錯誤(因爲你也越來越)。感謝您的幫助:),我會爲此創建一張新票。 –

+0

不錯的調查工作,+1! – Matt