2017-10-14 110 views
2

考虑这个模型的Django文档中筛选相关的表对象他们的书。 如果我想查询作者注释的作者的平均比率,例如2016年已发布的作品,该怎么办。Django的查询集聚合之前

请注意,我想用尽可能少的查询来获得结果。

+0

你能描述'Author'和'Book'的模型吗? –

+0

它们位于我在第一行中引用的文档页面的开头。 –

回答

4

鉴于Book模型有一个属性pubdate这是一个DateField,你可以使用:

from datetime import datetime 

y2016 = datetime(2016,1,1) 

Author.objects.filter(book__pubdate__lt=y2016) \ 
       .annotate(average_rating=Avg('book__rating'))

所以book__pubdate__lt意味着你检查bookpubdate小于(__lty2016(中2016年1月初)。

万一filter被的annotate之前应用它会过滤掉书前,其2016年需要注意的是那些没有在2016年前publised作者将在生成的QuerySet被publised。但这似乎是合乎逻辑的(因为你无法计算空集上的平均值)。

+1

是不是只会过滤2016年之前至少有一本书的作者,但是仍然会以** all **的平均值对他们的书进行注释? – schwobaseggl

+0

@schwobaseggl:afaik,它不会。没有图书的过滤器将不会出现在结果中。但是基于其他查询,它将省略2016年之前发布的图书。 –

+0

book__pubdate__lt = y2016仅表示查找2016年以前已发布图书的作者。它不会按pubdate过滤图书。 –