【问题标题】:Grouping aggregations in Django在 Django 中对聚合进行分组
【发布时间】:2020-11-09 16:38:07
【问题描述】:

对于报告,我想将一些计数组合在一起,但仍然可以访问行数据。我觉得我经常这样做,但今天找不到任何代码。这是在 B2B 视频交付平台中。我的建模的简化版本:

  • 视频(名称)
  • 公司(名称)
  • 查看(视频、公司、时间)

我想显示哪些公司观看的视频最多,同时也显示哪些视频最受欢迎。

+-----------+-----------+-------+
|  Company  |   Video   | Views |
+-----------+-----------+-------+
| Company E |  Video 1  |  1215 |
|           |  Video 2  |     5 |
|           |  Video 3  |     1 |
| Company B |  Video 2  |   203 |
|           |  Video 4  |     3 |
+-----------+-----------+-------+

我可以通过注释视图(以获得公司订单的权利,首先是大多数视图)然后循环公司并为每个公司执行视图查询来做到这一点,但是我如何在 O(1-3 ) 查询而不是 O(n)?

【问题讨论】:

  • 你能把你的模型贴出来吗(简化版就可以了)
  • @iklinac 我做了,非常简单。视频、公司和日志模型将两者联系在一起的视图。
  • 我建议您使用公司的值、聚合和 select_related。当我要求模型时,没有费心写完整的解决方案,这样我就不需要重写它们了:)

标签: django django-queryset django-aggregation


【解决方案1】:

所以我想我是通过.values() 到达那里的。我似乎总是被这个绊倒,这确实意味着我必须进行几次额外的查找才能提取视频和公司名称......但是 3 感觉比 n 次查询更健康。

results = (
    Video.objects
    .values('views__company_id', 'id')
    .annotate(
        view_count=Count('views', filter=q_last_month)  # filter count based on last month
    )
)

【讨论】:

    猜你喜欢
    • 2018-08-07
    • 1970-01-01
    • 2018-03-19
    • 2012-11-04
    • 2017-02-14
    • 2020-02-26
    • 1970-01-01
    • 2023-04-02
    • 1970-01-01
    相关资源
    最近更新 更多