django - 如何使用 Django 进行分组和聚合

标签 django django-aggregation

我有一个相当简单的查询,我想通过 ORM 进行,但无法弄清楚..

我有三个模型:

Location(一个地方)、Attribute(一个地方可能具有的属性)和 Rating(一个 M2M“通过”模型,还包含一个分数字段)

我想选择一些重要的属性并能够根据这些属性对我的位置进行排名 - 即所有选定属性的总分越高 = 越好。

我可以使用以下 SQL 来获取我想要的内容:

select location_id, sum(score) 
    from locations_rating 
    where attribute_id in (1,2,3) 
    group by location_id order by sum desc;

返回

 location_id | sum 
-------------+-----
          21 |  12
           3 |  11

我能得到的最接近 ORM 的是:

Rating.objects.filter(
    attribute__in=attributes).annotate(
    acount=Count('location')).aggregate(Sum('score'))

返回

{'score__sum': 23}

即所有的总和,不按位置分组。

有什么办法解决这个问题吗?我可以手动执行 SQL,但宁愿通过 ORM 来保持一致。

谢谢

最佳答案

试试这个:

Rating.objects.filter(attribute__in=attributes) \
    .values('location') \
    .annotate(score = Sum('score')) \
    .order_by('-score')

关于django - 如何使用 Django 进行分组和聚合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13403609/

相关文章:

Django 独特的 Slug(按 id)

python - 根据条件使用外键计数注释 Django 查询集

python - F 表达式列表的求和

sql - Django ORM中多对多字段的复杂计数

python - 无法使用 django 加载 css 文件

django - 在 Django Rest Framework 中访问 .data 后更新序列化器中的值

python - 动态自定义 django 管理列?

python - 根据某些条件从模型中过滤数据

django:基于时间范围的聚合查询

Django 查询 - 是否可以在数据库级别按公共(public)字段对元素进行分组?