Django ORM:聚合注释会引发DatabaseError

时间:2013-07-19 12:46:43

标签: django-orm

如果我将模型 Book 定义为:

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 又返回 QuerySet (而不是 ValuesQuerySet ),因此聚合方法运行成功。但在我的示例中,聚合 ValuesQuerySet 会引发 DatabaseError

这是Django中的错误吗?因为如果Django不支持聚合 ValuesQuerySet ,那么它应该在Django级别引发异常(不是 DatabaseError )。

更新

此错误已在此处解决:https://code.djangoproject.com/ticket/20782

1 个答案:

答案 0 :(得分:1)

看来你遇到了一个错误。你应该在django trac instance上记录这个。

具体说明您使用的是哪个DB后端。我目前正在测试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失败。