2011-10-12 7 views
11

मैं इस तरह कई रिश्तों के लिए कई के साथ मॉडल है:तार्किक या Django के कई प्रश्नों के लिए कई रिटर्न डुप्लिकेट परिणाम

class Contact(models.Model): 
    name = models.TextField() 
    address = models.TextField() 

class Mail(models.Model): 
    to = models.ManyToManyField(Contact, related_name='received_mails') 
    cc = models.ManyToManyField(Contact, related_name='cced_mails') 

मैं मैदान के लिए संपर्क है कि या तो कर रहे हैं के सेट या सीसी प्राप्त करने के लिए चाहते हैं किसी दिए गए ईमेल के लिए फ़ील्ड। के कोशिश करते हैं:

>>> Contact.objects.filter(received_mails__id=111) 
[<Contact: [email protected]>] 
>>> Contact.objects.filter(cced_mails__id=111) 
[<Contact: [email protected]>] 

अब तक तो अच्छा। हमारे पास प्रत्येक संबंध के लिए एक संपर्क है। लेकिन उन्हें दोनों को एक ही प्रश्नोत्तरी में प्राप्त करना अच्छा लगेगा।

>>> Contact.objects.filter(Q(received_mails__id=111) | Q(cced_mails__id=111)) 
[<Contact: [email protected]>, <Contact: [email protected]>, <Contact: [email protected]>, <Contact: [email protected]>, <Contact: [email protected]>, <Contact: [email protected]>, <Contact: [email protected]>, <Contact: [email protected]>, <Contact: [email protected]>, <Contact: [email protected]>, <Contact: [email protected]>, <Contact: [email protected]>, <Contact: [email protected]>, <Contact: [email protected]>, <Contact: [email protected]>, <Contact: [email protected]>, <Contact: [email protected]>, <Contact: [email protected]>, <Contact: [email protected]>, <Contact: [email protected]>, '...(remaining elements truncated)...'] 

क्या हुआ? मुझे लगता है कि एसक्यूएल में टेबल में शामिल होने के साथ कुछ करना है, लेकिन मुझे वास्तव में समझ में नहीं आता कि कई रिश्तों के साथ हुड के तहत क्या हो रहा है। यह हो सकता है कि मैं जो करने की कोशिश कर रहा हूं वह बेवकूफ है, या ऐसा करने का एक आसान तरीका है। किसी भी तरह से, मुझे सही रास्ते पर सेट करने में खुशी है।

संपादित करें:

SELECT `mailshareapp_contact`.`id`, `mailshareapp_contact`.`name`, 
`mailshareapp_contact`.`address` FROM `mailshareapp_contact` 
LEFT OUTER JOIN `mailshareapp_mail_to` 
ON (`mailshareapp_contact`.`id` = `mailshareapp_mail_to`.`contact_id`) 
LEFT OUTER JOIN `mailshareapp_mail_cc` 
ON (`mailshareapp_contact`.`id` = `mailshareapp_mail_cc`.`contact_id`) 
WHERE (`mailshareapp_mail_to`.`mail_id` = 111 
OR `mailshareapp_mail_cc`.`mail_id` = 111) 

उत्तर

16

एसक्यूएल के रूप में मिलान करने वाले सभी रिकॉर्ड देता है, Django कर्तव्यनिष्ठा उन्हें वस्तुओं के लिए नक्शे: इस क्वेरीसमूह की क्वेरी है। आप जो खोज रहे हैं वह .distinct() क्वेरीसेट विधि है जो एसक्यूएल को सभी डुप्लिकेट पंक्तियों को एक में पतन कर देता है।

+0

यह चाल है, धन्यवाद। (क्षमा करें, मैं अभी तक आपको वोट नहीं दे सकता।) यह केवल चयन के बजाय SELECT DISTINCT का उपयोग करके क्वेरी को बदलता है। मैं नहीं देखता कि आप इसके बिना _so many_ डुप्लिकेट कैसे प्राप्त कर सकते हैं, लेकिन मेरी तत्काल समस्या हल हो गई है। –

+0

आपको 'mailshareapp_contact' × (' mailshareapp_mail_to' + 'NULL') के प्रत्येक संयोजन के लिए एक अलग पंक्ति मिल जाएगी × (' mailshareapp_mail_cc' + 'NULL') जो कम से कम एक जॉइन और एक WHERE क्लॉज को संतुष्ट करती है। वैसे, यदि उपरोक्त आपके प्रश्न का उत्तर देता है, तो आप इसे हमेशा स्वीकृत प्रतिक्रिया के रूप में चिह्नित कर सकते हैं। – patrys

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