2013-06-28 10 views
20

मैं दो एनोटेट कॉलमघटाने दो एनोटेट कॉलम

की कुल पर सॉर्ट करने के लिए सक्षम होना चाहिए

तो मैं इस तरह कुछ करने के लिए करना चाहते हैं:

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

क्या किसी को पता है कि उपरोक्त की तरह कुछ कैसे पूरा किया जाए?

+3

मेरा मानना ​​है कि Django ORM इतना झुका नहीं सकता है, लेकिन मैं आपका प्रश्न उठा रहा हूं क्योंकि मैं देखना चाहता हूं कि कोई भी इसे अभी तक खींच सकता है या नहीं। मेरी सलाह है कि कच्चे एसक्यूएल के साथ या तो अपने हाथों को गंदे मिलकर या सक्लाक्लेमी जैसे अधिक शक्तिशाली ओआरएम का उपयोग करें (आप इसे Django ORM के साथ उपयोग कर सकते हैं, SQLSoup देखें)। –

+3

यह सुविधा इसे Django https://github.com/django/django/pull/2496 के भविष्य के संस्करण में बनाने के करीब है – Anentropic

उत्तर

7

वास्तव में,

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

काम करता है आप इसे starting with Django 1.8 चाहते हैं के रूप में।

1

Ticket (2014 से) और अधिक से अधिक 4 साल के लिए होती है, लेकिन यह इस तरह, एक छोटे से .extra() क्वेरी के साथ पूरा किया जा सकता है:

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

हाँ, यह अलग से थोड़ा अप्रत्याशित हो सकते हैं डीबीएमएस। लेकिन यदि आप अतिरिक्त सामान्य एसक्यूएल के अंदर सिंटैक्स को सीमित करते हैं तो इसे हर जगह कम या ज्यादा काम करना चाहिए।

संबंधित मुद्दे