如果我将模型 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 )。
更新:
答案 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尝试了同样的事情,同样的错误。您似乎无法将aggregate
与ValuesQuerySet
一起使用。
django 1.4,1.5和1.6失败。