2008-11-06 8 views
8

मैं SQLAlchemy 0.5rc उपयोग कर रहा हूँ, और मैं, एक रिश्ता करने के लिए एक स्वचालित फ़िल्टर जोड़ने के लिए इतना है कि हर बार यह कोशिश करता है कि संबंध के लिए रिकॉर्ड लाने के लिए चाहते हैं, यह "दूरस्थ" लोगों पर ध्यान नहीं देता है अगर वे के रूप में चिह्नित कर रहे हैं "logically_deleted" (बच्चे तालिका के एक बूलियन क्षेत्र)SQLAlchemy के साथ संबंध में स्वचालित फ़िल्टर कैसे जोड़ें?

उदाहरण के लिए, एक वस्तु "जनक" एक "बच्चों" संबंध 3 रिकॉर्ड है कि है, लेकिन उनमें से एक तार्किक, हटा दिया जाता है जब मैं "के लिए क्वेरी अगर जनक "मैं को SQLA चाहते हैं सिर्फ दो बच्चों के साथ माता-पिता वस्तु लाने ..
मैं इसे कैसे करना चाहिए? प्राथमिकता संबंध के पैरामीटर को "और" स्थिति जोड़कर? (उदाहरण के लिए "Children.parent_id == Parent.id and Children.logically_deleted == False", लेकिन यह सही लिखने के लिए "और" इस ​​तरह से है?)

संपादित करें:
मैं इस तरह से

children = relation("Children", primaryjoin=and_(id == Children.parent_id, Children.logically_deleted==False)) 

में ऐसा करने में कामयाब रहे, लेकिन वहाँ एक रास्ता है प्राथमिक स्ट्रिंग के रूप में स्ट्रिंग का उपयोग करने के लिए?

उत्तर

3

and_() फ़ंक्शन, SQLAlchemy में तार्किक संयोजक करने के लिए सही तरीका है एक साथ & ऑपरेटर के साथ, लेकिन बाद के साथ सावधान रहना क्योंकि इसमें आश्चर्यजनक प्राथमिकता नियम हैं, यानी तुलना ऑपरेटर की तुलना में उच्च प्राथमिकता।

तुम भी एक स्ट्रिंग के रूप में एक प्राथमिक पाठ() निर्माता के साथ शामिल होने के इस्तेमाल कर सकते हैं, लेकिन किसी भी तालिका अलियासिंग कि eagerloading साथ आता है और मिलती है के साथ अपने कोड को तोड़ने कर देगा।

तार्किक विलोपन के लिए, यह बेहतर हो सकता है एक का चयन करें, जिन्हें हटाया मूल्यों पर ध्यान नहीं देता से अधिक पूरी कक्षा मैप करने के लिए:

mapper(Something, select([sometable], sometable.c.deleted == False)) 
+0

क्या इसका अनुवाद __mapper_args__ का उपयोग करने के लिए किया जा सकता है? मेरा मतलब है कि मैं घोषणात्मक का उपयोग कर रहा हूँ। – Marconi

+0

मैंने इसे mapper_args में उपयोग करने का प्रयास किया, लेकिन मुझे एक त्रुटि संदेश मिला "मैपर() को कीवर्ड तर्क 'local_table' के लिए कई मान मिल गए हैं। तो मुझे डर है कि यह बेकार है। –

0

मैं केवल वर्तमान के खिलाफ 0.4.something विकासशील हूँ, लेकिन यहाँ है कि कैसे मैं यह सुझाव चाहते हैं:

db.query(Object).filter(Object.first==value).filter(Object.second==False).all() 

मुझे लगता है कि आप क्या करना है, है ना कोशिश कर रहे हैं क्या है?

(नोट: एक वेब ब्राउज़र में लिखा है, नहीं असली कोड!)

+0

नहीं, मैं कुछ स्वत लिए देख रहा था .. मैं सवाल :) धन्यवाद स्पष्ट करेंगे हालांकि! – Joril

+0

कोई चिंता नहीं। मुझे लगता है कि मैं समझता हूं कि आप क्या करने की कोशिश कर रहे हैं, लेकिन मुख्य रूप से आपके द्वारा प्रदान किए गए कोड को पढ़ रहे हैं! –

6

लेकिन वहाँ के रूप में के बजाय primaryjoin एक स्ट्रिंग का उपयोग करने के लिए एक रास्ता है?

आप निम्न का उपयोग कर सकते हैं:

children = relationship("Children", primaryjoin="and_(Parent.id==Children.parent_id, Children.logically_deleted==False)" 

यह मेरे लिए काम किया!

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