【问题标题】:Django queryset - Filtering related table objects before aggregationDjango queryset - 在聚合之前过滤相关的表对象
【发布时间】:2017-10-14 13:24:07
【问题描述】:

在 Django 文档中考虑这个模型: Aggregation and Avg

有一个这样的查询集:

Author.objects.annotate(average_rating=Avg('book__rating'))

它返回按所有书籍的平均比率注释的所有作者。 如果我想查询作者的平均出版率(例如 2016 年),该怎么办?

请注意,我希望通过尽可能少的查询获得结果。

【问题讨论】:

  • 你能描述一下AuthorBook的型号吗?
  • 它们位于我在第一行中引用的文档页面的开头。

标签: python django aggregate


【解决方案1】:

鉴于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 年之前未出版的作者将不 在结果 QuerySet 中。但这似乎合乎逻辑(因为您无法计算空集的平均值)。

【讨论】:

  • 这不是只过滤那些在 2016 年之前至少有一本书的作者,但仍然用平均所有他们的书来注释那些作者吗?
  • @schwobaseggl:afaik,它不会。没有书籍的过滤器不会出现在结果中。但根据其他查询,它会因此排除 2016 年之前出版的书籍。
  • 基于these queries 确实如此。
  • @WillemVanOnsem 我的立场是正确的。不完全直观,但我会记住的!
  • @schwobaseggl:我同意这是一种“危险的语法”。但我没有发明那个:)。
猜你喜欢
  • 1970-01-01
  • 2021-11-24
  • 2012-05-13
  • 2018-10-09
  • 2016-01-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-20
相关资源
最近更新 更多