2011-08-11 14 views
7

के साथ रिकॉर्ड द्वारा Django Query फ़िल्टरिंग क्या एक Django क्वेरी फ़िल्टर करने का कोई आसान तरीका है जिसके आधार पर कॉलम में अधिकतम/न्यूनतम मान है? मैं अनिवार्य रूप से thesequestions पूछ रहा हूं, लेकिन Django के ORM के विशिष्ट संदर्भ में।अधिकतम कॉलम वैल्यू

उदा।

कहें कि मेरे पास एक मॉडल है जो सभी के फोन नंबरों के ऐतिहासिक मूल्यों को संग्रहीत करने के लिए डिज़ाइन किया गया है।

class Person(models.Model): 
    name = models.CharField(max_length=100) 
    phone = models.CharField(max_length=100) 
    created = models.DateTimeField(auto_now_add=True) 

रिकॉर्ड के साथ:

Person(name='Jim',phone='123-456-9870', created=datetime(2005,1,2,4,2)) 
Person(name='Jim',phone='329-802-9870', created=datetime(2006,9,2,7,8)) 
Person(name='Sue',phone='324-345-3450', created=datetime(2008,7,4,6,1)) 

अब कहते हैं कि मैं हर किसी के सबसे हाल ही में फोन नंबर खोजने के लिए करना चाहता था।

एसक्यूएल में, मैं आमतौर पर अधिकतम मूल्यों की गणना करने के लिए एक सबक्वेरी उपयोग करने के लिए होगा:

SELECT p1.name, p1.phone, p1.created 
FROM person_person p1, (
    SELECT name, MAX(created) AS max_created 
    FROM person_person 
    GROUP BY name 
) AS p2 
WHERE p1.name = p2.name AND p1.created = p2.max_created 

वहाँ Django में किसी भी तंत्र है कि इस को आसान बनाने में कर सकता है?

मैं अपने बैकएंड पर PostgreSQL का उपयोग कर रहा हूं, इसलिए पोस्टग्रेएसक्यूएल विशिष्ट कार्यक्षमता पर भरोसा करने वाले किसी भी विचार या समाधान उपयोगी होंगे।

+0

ऐसा लगता है कि django पर आप जो भी खोज रहे हैं वह तब तक नहीं कर सकता जब तक कि आप कच्चे क्वेरी sql का उपयोग न करें। [यह] जांचें (https://docs.djangoproject.com/en/dev/ref/models/querysets/#distinct)। चूंकि इस समय आप एक ऑर्डर_बी ('बनाया') जोड़ते हैं जो बनाई गई क्वेरी में चयन में जोड़ा जाता है, तो विशिष्ट कुछ भी नहीं करेगा। – Hassek

उत्तर

4

शायद आप यहां कच्चे एसक्यूएल का उपयोग करना चाहते हैं, raw() प्रबंधक विधि यह सुविधा प्रदान करता है, जिससे आप अपनी क्वेरी से मॉडल उदाहरण वापस कर सकते हैं। एकमात्र चाल यह है कि कच्चे प्रश्न को प्राथमिक कुंजी शामिल करने की आवश्यकता है। यह शायद आप के लिए काम करना चाहिए (जब तक आप id के अलावा कुछ करने के लिए प्राथमिक कुंजी सेट है):

latest_phone_numbers = Person.objects.raw(''' 
SELECT p1.id, p1.name, p1.phone, p1.created 
FROM person_person p1, (
    SELECT name, MAX(created) AS max_created 
    FROM person_person 
    GROUP BY name 
) AS p2 
WHERE p1.name = p2.name AND p1.created = p2.max_created 
''') 
1

अपने बैकएंड PostgreSQL Roman Pekarthis प्रश्न के लिए एक अच्छा जवाब दिया है।

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