Subtracting two annotated columns

大城市里の小女人 提交于 2019-11-28 06:59:31

问题


I need to be able to sort on the aggregate of two annotated columns

So I'd like to do something like this:

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

and then:

c = c.order_by('variance')

Does anyone know how to accomplish something like the above?


回答1:


Actually,

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

works as you would like it to starting with Django 1.8.

Moreover, you can also order by an expression, which means you can just use:

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

or even just:

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



回答2:


Ticket is there for more than 4 years (by 2014), but it can be accomplished with a little .extra() query, like this:

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

Yes, it can be a bit unpredictable with different DBMS. But if you limit the syntax inside extra to very common SQL it should work more or less everywhere.



来源:https://stackoverflow.com/questions/17374467/subtracting-two-annotated-columns

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!