减去两个带注释的列

时间:2013-06-28 22:15:56

标签: python django django-orm

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

所以我想做这样的事情:

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')

有谁知道如何完成上述内容?

2 个答案:

答案 0 :(得分:10)

实际上,

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

works as you would like it to starting with Django 1.8

此外,您还可以通过表达式进行排序,这意味着您只需使用:

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

甚至只是:

c = c.order_by(Sum('results__metric') - Sum('results__metric_prior'))

答案 1 :(得分:2)

Ticket有超过4年的时间(到2014年),但可以通过一些.extra()查询完成,如下所示:

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

是的,使用不同的DBMS可能有点不可预测。但是如果你将extra的语法限制在非常普通的SQL中,它应该或多或少地在所有地方工作。