在Django中计数多个列并排序
我们数据库里有一个叫做 Analysis 的表,这个表里的每一条记录都存储了特定构建的信息。不过,由于最开始设置数据库时的限制,我们把这些信息分成了两个列:build_info 和 build。每个 Analysis 记录只会有一个字段是有效的,另一个会是 NULL(也就是说,同一条记录里不可能同时有 build_info 和 build 有值)。
我想做的是获取这个表中构建相关列的最高计数。SQL 查询相对简单,而 Django 的 ORM 查询(当然)稍微复杂一点。这是我想要的确切 SQL 查询(这个查询返回的正是我需要的信息):
select build_info, build_id, count(*) as build_count
from analysis
group by build_info, build_id
order by build_count desc
很简单。现在我有的 Django 查询是这样的(注意这个查询目前还不能工作):
Analysis.objects.values("build_info", "build").annotate(build_info_count = Count("build_info"), build_count = Count("build")).order_by([?!?!?])
问题出在 order_by() 这个调用上。目前返回的 QuerySet 有两个不同的计数列:build_info_count 和 build_count。我需要根据 build_info_count 和 build_count 的组合来对返回的 QuerySet 进行排序,但 order_by() 函数只接受一个参数,我还找不到方法来组合多个 Count() 对象。
有没有办法在 Django 中对多个列进行计数?或者至少把各个列的计数合并成一个?或者有没有其他方法可以实现上面的 SQL 查询?
1 个回答
1
我最后选择用了原始查询。Django的ORM(对象关系映射)在很多情况下都很好用,但如果遇到特别复杂的情况,直接写SQL查询会更好(而且性能也更好)。