出于某种原因,我必须使用原始SQL查询,该查询将传递给django以使用mymodel.objects.raw(查询)执行。但我发现主键需要通过始终。这就是阻止我进行一些查询的原因。
想象一个简单的查询,我在表上执行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)
如果即使在运行聚合命令后我也可以查看所有单独的行,这对我没用。有没有其他方法来获得这里提到的第一个结果与RAW查询只与django?一些破解主键的方法?
答案 0 :(得分:6)
一种可能的解决方案是直接使用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()