26

我需要能够对两个带注释的列的聚合进行排序

所以我想做这样的事情:

c = c.annotate(metric=Sum('results__metric'))
c = c.annotate(metric_prior=Sum('results__metric_prior'))
c = c.annotate(variance=F('metric')-F('metric_prior')) #doesn't work, for demonstrative purposes only

接着:

c = c.order_by('variance')

有谁知道如何完成类似上述的事情?

4

2 回答 2

18

实际上,

c = c.annotate(variance=F('metric')-F('metric_prior'))

从 Django 1.8 开始按您的意愿工作

此外,您还可以按表达式排序,这意味着您可以使用:

c = c.order_by(F('metric') - F('metric_prior'))

甚至只是:

c = c.order_by(Sum('results__metric') - Sum('results__metric_prior'))
于 2016-08-19T19:00:35.950 回答
2

已经存在超过 4 年(到 2014 年),但可以通过一点.extra()查询来完成,如下所示:

items = MyModel.objects.extra(
    select = {'variance': 'SUM(relatedModel__someField) - SUM(relatedModel__someField)'},
)

是的,使用不同的 DBMS 可能有点不可预测。但是,如果您将额外的语法限制为非常常见的 SQL,它应该或多或少在任何地方都可以使用。

于 2014-10-28T06:25:52.770 回答