2012-03-20 15 views
5
NDB साथ

और एक प्रश्न आप की तरह सिंटैक्स का उपयोग करने की आवश्यकता पर फिल्टर का उपयोग करने के लिए नई क्वेरी वर्ग:NDB क्वेरी छानने

qry = MyModel.query(MyModel.title == 'title') 

मैं कैसे में जानने के बिना एक मॉडल पर क्वेरी कर सकता है अग्रिम मुझे किस संपत्ति पर पूछना है?

kwargs = {'title' : 'mytitle', 
      'age' : 34 } 

q = MyModel.all() 

for kw, vals in kwargs.items(): 
    if not isinstance(vals, (list, tuple)): 
     vals = (vals,) 
    for v in vals: 
     q.filter('%s =' % kw, v) 

मैं कैसे इस NDB साथ प्राप्त कर सकते थे:

'पुराने' जिस तरह से मैं कुंजी और पर क्वेरी करने के लिए मूल्यों के साथ एक शब्दकोश था और कुंजी और मूल्यों से अधिक लूप में चलाए साथ

?

उत्तर

13

, या प्रॉपर्टी का नाम, आप आसानी से GenericProperty का उपयोग कर ऐसा कर सकते हैं: नाम से

kwargs = {'title' : 'mytitle', 
      'age' : 34 } 

q = MyModel.query() 

for kw, vals in kwargs.items(): 
    if not isinstance(vals, (list, tuple)): 
     vals = (vals,) 
    for v in vals: 
     q = q.filter(ndb.GenericProperty(kw) == v) 

वैकल्पिक रूप से, अगर आप सिर्फ एक मौजूदा संपत्ति लगाना चाहते हैं (अपने मॉडल उपवर्ग में परिभाषित), आप _properties वर्ग विशेषता इस्तेमाल कर सकते हैं, जैसे

 q = q.filter(MyModel._properties[kw] == v) 

या यहाँ तक कि) वर्ग से इसे पाने के लिए का उपयोग getattr (:

 q = q.filter(getattr(MyModel, kw) == v) 

अंतर यह है कि getattr() जबकि _properties द्वारा अनुक्रमित संपत्ति के "अजगर" नाम का उपयोग करता है " डेटास्टोर "संपत्ति का नाम। ये केवल अलग है जब संपत्ति की तरह

class MyModel(ndb.Model): 
    foo = StringProperty('bar') 

कुछ के साथ घोषित किया गया था यहाँ अजगर नाम foo है, लेकिन डेटासंग्रह नाम बार है।

+0

धन्यवाद। यह भी नहीं पता कि मैंने इस बारे में क्यों नहीं सोचा था ... – aschmid00

+0

इसने गतिशील गुणों की अनुमति दी। क्या डायनामिक ऑपरेटर के साथ-साथ < and > को अनुमति देने का कोई तरीका है? –

+1

ठीक है, ऊपर दिए गए मेरे प्रश्न का उत्तर यहां प्राप्त हुआ: http: // stackoverflow।com/प्रश्न/8766150/कैसे करने वाली बनाने के एक क्वेरी के लिए मिलान कुंजी। मूल रूप से, फिल्टर –

0

आप अभी भी एक शब्दकोश के साथ ऐसा कर सकते हैं - कुंजी बस तार के बजाय मॉडल गुण, इस तरह होने की जरूरत है: अगर आप परवाह नहीं है मान्य यदि यह एक expando मॉडल है

kwargs = {MyModel.title : 'mytitle', 
      MyModel.age : 34 } 
q = MyModel.query() 
for prop, value in kwargs.items(): 
    q = q.filter(prop == value) 
+0

मेरा मानना ​​है कि यह 100% सही नहीं है: [एनडीबी क्वेरी ऑब्जेक्ट्स अपरिवर्तनीय हैं] (http://code.google.com/appengine/docs/python/ndb/queries.html#filter_by_prop)। तो, आपके कोड में अंतिम पंक्ति को "q = q.filter (prop == value)" – alex

+0

जैसे कुछ पढ़ना चाहिए, यह वही नहीं है जो मुझे चाहिए। मेरे पास केवल एक स्ट्रिंग के रूप में संपत्ति लेबल है। तो कोई MyModel.title लेकिन केवल 'शीर्षक' नहीं। स्ट्रिंग द्वारा मॉडलों की संपत्ति प्राप्त करने का कोई तरीका है? – aschmid00

+0

@alex ओह, यह डीबी से एक बदलाव है जिसे मैं किसी भी तरह याद करता हूं। मैं अपना जवाब ठीक कर दूंगा। –

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