将工作SQL转换为Django ORM - 基于两个字段的SUM聚合

时间:2015-07-07 18:56:51

标签: sql django postgresql django-orm

我正在尝试将正在运行的SQL查询转换为Django ORM语句。

对于每个位置,我想根据每个日期+位置的所有活动的总和来检索最受欢迎的日期。

Django模特:

class Location(models.Model):
    slug = models.SlugField(unique=True)

class Raw(models.Model):
    location = models.ForeignKey('Location', related_name='raw')
    activities = models.PositiveIntegerField(db_index=True)
    date = models.DateField(db_index=True)

数据集:

    date    | activities | location_slug    
------------+------------+-----------
 2015-07-02 |        234 | london
 2015-07-07 |        100 | london
 2015-07-02 |         51 | london
 2015-07-02 |         12 | melbourne
 2015-07-02 |        111 | melbourne
 2015-07-01 |       1234 | berlin
 2015-07-01 |         12 | berlin

使用SQL。

SELECT DISTINCT ON (slug) date, slug, SUM(activities)
FROM core_raw, core_location
WHERE core_location.id = core_raw.location_id
GROUP BY date, slug
ORDER BY slug, sum DESC;

结果:

    date    |   slug    | sum  
------------+-----------+------
 2015-07-01 | berlin    | 1246
 2015-07-02 | london    |  285
 2015-07-02 | melbourne |  123

如何使用Django ORM执行此操作?它甚至可能吗?!

1 个答案:

答案 0 :(得分:0)

这可以提供帮助。

from django.db.models import Sum

values = Raw.objects.all().values('location_slug','date').annotate(data_sum=Sum('activities')).distinct()