有没有一种方法可以在Django Querysets中组合注释和过滤的聚合?

时间:2019-05-28 12:55:09

标签: python django python-3.x django-models

我有一个复杂的查询,尽管它很容易用python代码完成,但我正在尝试通过Django Querysets进行。

使用https://docs.djangoproject.com/en/2.2/topics/db/aggregation/#aggregating-annotations中的示例模型,我想做的是用每个作者的总销售额的平均值来注释每个发布者。但是,每位作者的总销售额应仅包括给定日期范围内的图书。

在一个查询中有什么方法可以做到这一点吗?当然,执行两个单独的查询并使用纯Python结合结果即可。但是,在我的特定用例中,每个数据库连接/断开连接都有大量开销,因此最好将它们组合成一个查询。此外,真实的数据集非常大,因此在服务器端进行聚合非常重要。

这是我期望的json输出示例:

{ "publishers": [{ "name": "testpublisher", "avg_recent_sales": "11.2" }, { "name": "anotherpublisher", "avg_recent_sales": "2.4" }] }

avg_recent_sales是每个作者在过去6个月中通过该出版商售出的平均图书数量。

1 个答案:

答案 0 :(得分:0)

Django queryset是惰性的。您可以根据需要进行多次过滤或注释,直到对其进行迭代为止(例如将其放入“ for”或将其转换为“ list”)

我已将“已售金额”添加到Book模型中。

books = Book.objects.filter(pubdate__range=(date1, date2))  # filter by given date range.
books = books.values('publisher__id', 'authors__id')  # create group by clause.
books = books.annotate(total_sale_per_author=Avg(F('sold_amount') * F('price')))  # add an annotation.

books = list(book)  # query will be occured here