【问题标题】:Django Model QuerySet Group By Specific FieldsDjango Model QuerySet 按特定字段分组
【发布时间】:2012-10-28 21:40:16
【问题描述】:

考虑到这个模型和数据:

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 自动对模型中的每个字段进行分组,所以分组并没有真正起作用(因为每一行都是唯一的)。

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


我知道可以这样做:

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

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

我也不能使用原始 SQL,因为它不是链式的

我也试过设置

MyQuerySet.group_by = ['ad_id']

也不行..

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

【问题讨论】:

  • 好像Ad_id不是模型的主键,请按原样发布模型。此外,您不能选择 date 等字段,而不会在 GROUP BY 中列出它
  • @okm 我更新了模型。关于日期:在 MySql 中可以运行这个查询(这对我来说也是新的)。但这并不是真正的问题。

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


【解决方案1】:

您可以使用Manager.raw() 执行原始 SQL 查询,在您的情况下是:

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

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

【讨论】:

  • 可以迭代,但不能链式。我做不到:Ad.objects.raw('...').filter(...)....
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-09-18
  • 1970-01-01
  • 2011-06-22
  • 2016-09-07
  • 1970-01-01
  • 1970-01-01
  • 2014-01-16
相关资源
最近更新 更多