python - 有没有办法在 Django Querysets 中组合注释和过滤聚合?
问题描述
我有一个复杂的查询,虽然它很容易在 python 代码中完成,但我正在尝试通过 Django Querysets 来完成。
使用来自https://docs.djangoproject.com/en/2.2/topics/db/aggregation/#aggregating-annotations的示例模型,我想要做的是用每个 Publisher 的总销售额的平均值来注释每个作者。但是,每位作者的总销售额应仅包括给定日期范围内的书籍。
有没有办法在一个查询中做到这一点?当然,使用纯 Python 执行两个单独的查询并连接结果是可行的。但是,在我的特定用例中,每个数据库连接/断开连接都会产生大量开销,因此最好将它们组合到一个查询中。此外,真实数据集非常大,因此在服务器端完成聚合至关重要。
这是我期望的 json 输出示例:
{
"publishers": [{
"name": "testpublisher",
"avg_recent_sales": "11.2"
}, {
"name": "anotherpublisher",
"avg_recent_sales": "2.4"
}]
}
avg_recent_sales
过去 6 个月内每位作者通过该出版商销售的平均图书数量在哪里?
解决方案
Django 查询集是懒惰的。您可以根据需要进行多次过滤或注释,直到您对其进行迭代(例如将其放入“for”或将其转换为“list”)
我已将“sold_amount”添加到 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
推荐阅读
- flutter - Flutter:从列表中删除元素不会删除循环生成的相应UI元素
- firebase - 参数类型'String'不能分配给firebase函数上的参数类型'Uri'
- python - 在python中将列转换为dts列表
- python - 谁能启发我如何从鼠标处理程序显示具有给定 hsv 边界的跟踪矩形?
- python - Python selenium 如何处理不可交互的字段
- selenium - 如何使用 selenium 和 Python 在弹出窗口中单击“接受 cookie”按钮,当弹出窗口没有 x 时如何继续
- jwt - 从 JWT 迁移到 Identity Server 4,部署后无需重新登录网站用户
- ios - 带有 UIView 的 UIScrollView 无法选择任何子视图项
- firebase - Firestore 循环的数据插入问题
- javascript - 后退按钮不适用于简单的 SPA 设置