2010-10-15 13 views
5

मैं एक क्वेरीसेट फ़िल्टर करना चाहता हूं कि कोई निश्चित सबक्वायरी कोई परिणाम देता है या नहीं। एसक्यूएल में यह ऐसा दिखाई दे सकता है:Django में "मौजूद" द्वारा "फ़िल्टर" कैसे करें?

SELECT * FROM events e WHERE EXISTS 
    (SELECT * FROM tags t WHERE t.event_id = e.id AND t.text IN ("abc", "def")) 

दूसरे शब्दों में, निर्दिष्ट संदेशों में से किसी एक के साथ टैग की गई सभी घटनाओं को पुनर्प्राप्त करें।

मॉडल Event और Tag पर Django के QuerySet API का उपयोग करके मैं इसे कैसे व्यक्त कर सकता हूं?

उत्तर

12

आप कुछ इस तरह कर सकते हैं:

q = Event.objects.filter(tag__text__in = ['abc', 'def']) 

मान लिया जाये कि है कि वहाँ Tag से Event करने के लिए एक ForeignKey

स्पष्टीकरण: आप विशिष्ट मानदंडों के आधार पर Event ऑब्जेक्ट्स फ़िल्टर कर रहे हैं। डबल अंडरस्कोर सिंटैक्स का उपयोग करके आप उदाहरणों के text विशेषता का उपयोग कर रहे हैं और फिर IN स्थिति को जोड़ रहे हैं। आपको विदेशी कुंजी पर शामिल होने के बारे में चिंता करने की ज़रूरत नहीं है; Django दृश्यों के पीछे तुम्हारे लिए यह करता है। मामले में आप क्वेरी उत्पन्न देखने के लिए उत्सुक हैं, आप इसे प्रिंट कर सकते हैं:

print q.query 
+0

आप मनोज धन्यवाद, मैं अक्सर Django में "स्पष्ट" कोशिश करते हैं और कुछ है कि नहीं बल्कि जटिल है के बारे में सोच शुरू करने के लिए भूल जाते हैं लगते हैं। –

5

मनोज का समाधान एक समस्या है जब वहाँ एक घटना के लिए एकाधिक टैग कर रहे हैं हो सकता है।

एसक्यूएल आंतरिक शामिल सभी पंक्तियों को वापस लौटाता है ताकि घटनाओं में डुप्लिकेट परिणाम हो सकें, समाधान अलग विधि जोड़ना है।

q = Event.objects.filter(tag__text__in = ['abc', 'def']).distinct()

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