2013-06-28 23 views
20

ho bisogno di essere in grado di ordinare l'aggregato di due colonne annotatisottrazione di due colonne annotati

Così mi piacerebbe fare qualcosa di simile:

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 

e poi:

c = c.order_by('variance') 

Qualcuno sa come realizzare qualcosa come sopra?

+3

Credo che l'ORM Django non possa essere piegato così tanto, ma sto inviando la tua domanda, perché mi piacerebbe vedere se qualcuno può allungarlo fino ad ora. Il mio consiglio è di sporcarti le mani usando SQL raw o utilizzare un ORM più potente come SQLAlchemy (puoi usarlo insieme a Django ORM, vedi SQLSoup). –

+3

questa funzione è vicina a farne una versione futura di Django https://github.com/django/django/pull/2496 – Anentropic

risposta

1

Ticket è lì per più di 4 anni (entro il 2014), ma può essere realizzato con un po '.extra() di query, in questo modo:

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

Sì, può essere un po' imprevedibile con diversi DBMS. Ma se si limita la sintassi all'interno di SQL molto comune, dovrebbe funzionare più o meno ovunque.