Django模型QuerySet按特定字段分组

时间:2012-11-08 16:31:45

标签: django django-models django-queryset django-orm

考虑到这个型号&数据:

Ad_id +日期=主键

    Ad_id  date   clicks
------------------------------
      3     8/10/12   124
      3     7/10/12   433
      3     6/10/12    99
      4     8/10/12    23
      4     7/10/12    80

我正在尝试按ad_id进行分组,以返回所有点击次数的总和。

用sql术语:

select Ad_id, date, sum(clicks) from ads group by Ad_id

问题是Django会自动为模型中的每个字段执行group by,因此group by并不真正起作用(因为每一行都是唯一的)。

我已经检查过的解决方案:


我知道可以这样做:

Ad.objects.values('ad_id').annotate(clicks_sum=Sum('clicks'))

但它并不好,因为它不会返回广告模型,而是返回字典。

我也不能使用原始SQL,因为它不可链接

我也尝试设置

MyQuerySet.group_by = ['ad_id']

也不行......

所以我真的需要按照我需要的字段进行分组,结果将是广告模型。

1 个答案:

答案 0 :(得分:2)

您可以使用Manager.raw()执行原始SQL查询,例如:

Ad.objects.raw('select Ad_id, date, sum(clicks) from ads group by Ad_id')

此方法方法接受原始SQL查询,执行它并返回RawQuerySet实例。这个RawQuerySet实例可以像普通QuerySet一样进行迭代,以提供对象实例。