2

如果我有一个模型定义为:

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)引发异常。

更新

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

4

1 回答 1

1

看来您遇到了错误。你应该在 django trac 实例上记录这个。

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

于 2013-07-20T02:49:57.200 回答