Django Raw查询:使用group BY子句进行Count查询

克沙夫·阿格劳瓦尔

由于某些原因,我必须使用原始SQL查询,该查询将传递给django以使用mymodel.objects.raw(query)执行。但是我看到主键始终需要传递这就是阻止我进行一些查询的原因。

想象一下一个简单的查询,其中我对表执行了count(*)并对两列进行了条件检查:

select count(*), column_value from tableX where column_label = 'Age' group by column_value having column_value > 30;

这在pgsql中可以正常工作,并给出如下结果:

 count | column_value 
-------+----------------
     1 |       38.00000
     2 |       45.00000
     1 |       35.00000
     1 |       44.00000

请注意第二行。那就是我想要的结果。但是,使用django时,我必须传递主键,为此,我必须更改查询,例如:

以“ id”作为主键:

    select count(*), id, column_value from tableX where column_label = 'Age' group by column_value, id having column_value > 30;

现在,这会给我这样的信息:

 count |  id  | column_value 
-------+------+----------------
     1 | 4041 |       45.00000
     1 | 3876 |       38.00000
     1 | 3821 |       45.00000
     1 | 3931 |       35.00000
     1 | 3986 |       44.00000
(5 rows)

即使运行聚合命令后,我仍然可以看到所有单独的行,这对我来说毫无用处。还有什么其他方法可以仅使用django通过RAW查询获得此处提到的第一个结果?有什么方法可以破解主键?

ec

一种可能的解决方案是connection.cursor()直接使用并执行原始查询:

from django.db import connection

cursor = connection.cursor()
cursor.execute("""select 
                      count(*), column_value 
                  from 
                      tableX 
                  where 
                      column_label = 'Age' 
                  group by 
                      column_value 
                  having 
                      column_value > 30""")
result = cursor.fetchall()

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章