django

2008-10-31 5 views
8

में पूर्ण बाहरी शामिल होने से मैं django QuerySet API का उपयोग कर एम 2 एम रिलेशनशिप में पूर्ण बाहरी जुड़ने के लिए क्वेरी कैसे बना सकता हूं?django

यह समर्थित नहीं है, ऐसा करने के लिए अपना स्वयं का प्रबंधक बनाने के बारे में कुछ संकेत आपका स्वागत होगा।

जोड़ने के लिए संपादित: @ S.Lott: ज्ञान के लिए धन्यवाद। बाहरी जॉइन की आवश्यकता एप्लिकेशन से आती है। इसे दर्ज डेटा दिखाते हुए एक रिपोर्ट उत्पन्न करना है, भले ही यह अभी भी अधूरा हो। मुझे इस तथ्य से अवगत नहीं था कि परिणाम एक नई कक्षा/मॉडल होगा। आपके संकेत मुझे थोड़ा सा मदद करेंगे।

उत्तर

11

Django सामान्य SQL समझ में "जुड़ता" का समर्थन नहीं करता है - यह ऑब्जेक्ट नेविगेशन का समर्थन करता है।

ध्यान दें कि एक रिलेशनल जॉइन (आंतरिक या बाहरी) इकाइयों की एक नई "कक्षा" बनाता है। एक जो Django में परिभाषा नहीं है। इसलिए कोई उचित "परिणाम सेट" नहीं है क्योंकि आपके द्वारा वापस आने वाली चीज़ों के लिए कोई क्लास परिभाषा नहीं है। सबसे अच्छा आप एक टुपल को परिभाषित कर सकते हैं जिसे गायब संयोजनों के लिए किसी के साथ पैक नहीं किया जाएगा।

एक बाएं (या दाएं) बाहरी शामिल इस तरह दिखता है। यह दो अपमानित सबसेट बनाता है, जिनके पास संबंधित संस्थाओं का एक संबद्ध सेट है, और जो नहीं करते हैं।

for obj in Model1.objects.all(): 
    if obj.model2_set().count() == 0: 
     # process (obj, None) -- no Model2 association 
    else: 
     for obj2 in obj.model2_set.all(): 
      # process (obj, obj2) -- the "inner join" result 

एक "पूर्ण" बाहरी जुड़ाव उन शेष वस्तुओं का एक संघ है जिनके संबंध नहीं हैं।

for obj2 in Model2.objects.all(): 
    if obj2.model1_set().count() == 0: 
     # process (None, obj2) -- no Model1 association 

समस्या हमेशा होती है, आप वस्तुओं के तीन अलग-अलग सबसेट के इस अजीब संग्रह के साथ क्या प्रसंस्करण कर रहे हैं?

ऑब्जेक्ट डेटाबेस का बिंदु ऑब्जेक्ट और उसके संबंधित ऑब्जेक्ट्स पर प्रसंस्करण पर ध्यान केंद्रित करना है।

"रिलेशनल जॉइन" नामक असाधारण संग्रह मूल ऑब्जेक्ट मॉडल में कभी नहीं होता है। यह दो (या अधिक) मूल वस्तुओं से निर्मित वस्तुओं की एक नई श्रेणी है।

बदतर, बाहरी जोड़ कई उप-वर्गों (आंतरिक जुड़ने, बाएं बाहरी जुड़ने और दाएं बाहरी जुड़ने) के साथ एक संग्रह बनाते हैं। चीजों का संग्रह का मतलब है?

प्रतीक्षा करें, यह और भी खराब हो सकता है। यदि प्रसंस्करण में अनुपलब्ध विशेषताओं के लिए चेक शामिल हैं (यानी if someObj.anObj2attribute is None: हम अनिवार्य रूप से Model1 आइटमों को Model2 ऑब्जेक्ट से जुड़े आइटम के साथ देख रहे हैं। उम्मम ... हमने उन्हें बाहरी शामिल होने में क्यों रखा, केवल if कथन का उपयोग करके उन्हें फ़िल्टर करने के लिए? क्यों न सिर्फ अलग-अलग क्वेरी AMD प्रक्रिया प्रत्येक सबसेट ठीक


संपादित करें:?।।, यह एक बाहरी-में शामिल होने बिल्कुल नहीं है जब आप दिखा रहे हैं "अपूर्ण" स्थिति यह बहुत आसान है आप बनाने की जरूरत आपके टेम्पलेट के प्रदर्शन के लिए आपके दृश्य फ़ंक्शन में एक (या दो) अलग संग्रह।

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

errorList1 = Model1.objects.filter(status="Incomplete") 
errorList2 = Model2.objects.filter(status="Incomplete") 

ये दोनों एक पूर्ण बाहरी शामिल होने के दो गैर-जुड़ने वाले हिस्सों हैं। फिर आप इन दो त्रुटि सूचियों को अपने टेम्पलेट में उचित कॉलम शीर्षक और स्थिति कोड और सब कुछ के साथ प्रदर्शित कर सकते हैं।

तुम भी उन्हें एक ही तालिका में डाल दिया वर्ष पूर्ण बाहरी नकल करने के लिए कर सकते हैं देखने के लिए

<table> 
    <tr><th>Model1</th><th>Model2</th></tr> 
    {% for e1 in errorList1 %} 
    <tr><td>e1</td><td>NULL</td></tr> 
    {% endfor %} 
    {% for e2 in errorList2 %} 
    <tr><td>NULL</td><td>e2</td></tr> 
    {% endfor %} 
</table> 

एक पूर्ण बाहरी ऐसा लगता है कि इस्तेमाल किया रिपोर्ट लोगों को शामिल होने की रिपोर्ट में शामिल हो। पूर्ण बाहरी शामिल होने के बिना।

+0

आप सही हैं। मैं एक ऐसा विचार लिखूंगा जो अजगर में मेरे "पूर्ण बाहरी जॉइन" के लिए आवश्यक तालिका की गणना करता है, उसके बाद परिणाम देने के लिए टेम्पलेट का परिणाम होता है। धन्यवाद। – Ber

1

कॉलिन, दोस्तों मैं के साथ काम में से एक, कुछ समय के लिए वापस एक पोस्ट लिखा कस्टम Django में मिलती है करने के बारे में:

http://www.caktusgroup.com/blog/2009/09/28/custom-joins-with-djangos-queryjoin/

तुम कुछ उपयोगी खोजने के लिए सक्षम हो सकता है!