【问题标题】:Count Multiple Columns in Django and Order计算 Django 中的多列并排序
【发布时间】: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


【解决方案1】:

我最终做了一个原始查询。 Django ORM 非常适合做很多事情,但是任何过于复杂的东西都最好在原始 SQL 查询中使用(性能也更好)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-30
    • 1970-01-01
    • 2021-01-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多