【发布时间】:2014-05-11 04:23:22
【问题描述】:
我们的数据库中有一个名为 Analysis 的表,其中每个对象都存储特定于构建的信息。不幸的是,由于数据库最初设置方式的限制,我们将这些信息存储在两列中:build_info 和 build。分析对象将只有这些字段中的一个有效,另一个将为 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 查询?
【问题讨论】:
-
您是否尝试过在原始查询中使用记录 ID 作为 count(*) 的代理,如:annotate(total_count = Count('id')).order_by('-total_count') ?
-
您是否可以使用“额外”字段在查询集上选择 count(*) 并按此排序? docs.djangoproject.com/en/dev/ref/models/querysets/#extra
标签: python database django orm