2011-09-30 14 views
25

से गतिशील रूप से क्वेरी फ़िल्टर बनाएं इसलिए मेरे पास एक वेब पेज से एक नियम पारित किया गया है। मैं गति के आधार पर गतिशील रूप से क्वेरी बनाना चाहता हूं। मुझे पता है कि मैं कर सकता हूं:SQLAlchemy - निर्देश

session.query(myClass).filter_by(**web_dict) 

हालांकि, यह केवल तभी काम करता है जब मान सटीक मिलान होते हैं। मुझे 'पसंद' फ़िल्टर करने की ज़रूरत है। मेरे सबसे अच्छे __dict__ विशेषता का उपयोग करने का प्रयास:

for k,v in web_dict.items(): 
    q = session.query(myClass).filter(myClass.__dict__[k].like('%%%s%%' % v)) 

सुनिश्चित नहीं हैं कि वहां से क्वेरी बनाने के लिए कैसे। कोई भी सहायता कमाल की होगी।

उत्तर

38

आप सही रास्ते पर हैं!

सबसे पहले जो आप करना चाहते हैं वह getattr का उपयोग करके विशेषताओं का उपयोग है, __dict__ नहीं; getattr हमेशा सही चीज करेगा, भले ही (अधिक ठोस मॉडल के मामले में हो) एक मैप किए गए विशेषता कॉलम प्रॉपर्टी नहीं है।

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

q = session.query(myClass) 
for attr, value in web_dict.items(): 
    q = q.filter(getattr(myClass, attr).like("%%%s%%" % value)) 
+2

टोकनमैकगुई फिर से हमला करता है। संगीत क्यू ... – MFB

+1

लॉल, मुझे वापस ले जाता है ... :) – MFB

+3

कृपया टिप्पणी में स्पैम मत करो ..! – PersianGulf