2008-09-18 9 views
8

मेरे पास एक मॉडल क्लास है:Google ऐप इंजन: मैं अपने मॉडल वर्ग के गुणों को प्रोग्रामेटिक रूप से कैसे एक्सेस कर सकता हूं?

class Person(db.Model): 
    first_name = db.StringProperty(required=True) 
    last_name = db.StringProperty(required=True) 

मेरे पास p में इस वर्ग का एक उदाहरण है, और स्ट्रिंग s में मान 'first_name' है। मैं कुछ ऐसा करना चाहता हूं:

print p[s] 

और

p[s] = new_value 

दोनों जिनमें से एक TypeError है।

क्या कोई जानता है कि मैं क्या हासिल कर सकता हूं?

+0

'डीआईआर (पी) 'शो क्या करता है? –

उत्तर

1
getattr(p, s) 
setattr(p, s, new_value) 
+0

अरे जिम, आपके उत्तर के लिए धन्यवाद। उपर्युक्त कोड परिणाम एट्रिब्यूट एरर में होता है। –

1

प्रयास करें:

p.model_properties()[s].get_value_for_datastore(p) 

the documentation देखें।

+0

क्या यह भी काम करेगा? model_properties एक क्लास विधि है, उदाहरण विधि नहीं। –

+0

धन्यवाद, आप मुझे सही रास्ते पर डाल दिया। सटीक उत्तर p.properties() [s] .get_value_for_datastore (p) –

7

यदि मॉडल वर्ग पर्याप्त बुद्धिमान है, तो इसे करने के मानक पायथन तरीकों को पहचानना चाहिए।

प्रयास करें:

getattr(p, s) 
setattr(p, s, new_value) 

भी hasattr उपलब्ध नहीं है।

+0

मैंने GAE और getattr और setattr का उपयोग ठीक किया है। –

+0

डेव, क्या यह संभव है कि db.Model और db.Expando कक्षाओं के बीच कोई अंतर हो? –

+0

बस इसे आज़माएं। ** setattr ** db.Model के साथ ठीक काम करते हैं! –

3

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

p.properties()[s].get_value_for_datastore(p) 

अन्य सभी उत्तरदाताओं के लिए, आपकी मदद के लिए धन्यवाद। मैंने यह भी उम्मीद की थी कि मॉडल वर्ग इसे करने के पायथन मानक तरीके को लागू करे, लेकिन किसी भी कारण से, यह नहीं है।

+0

get_value_for_datastore का उपयोग क्यों करें? यदि आप वही प्रतिनिधित्व चाहते हैं जो आपको p.first_name से मिलेगा, तो आपको उसे कॉल नहीं करना चाहिए। –

+0

आपके प्रश्न के दूसरे भाग के बारे में क्या? पी [एस] = new_val के बारे में क्या? –

-1

p.first_name = "नई पहला नाम" p.put()

या पी = व्यक्ति (first_name = "Firsty", last_name = "Lasty") p.put()

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

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