2010-01-16 11 views
7

में ऑब्जेक्ट लाने के बिना संबंधित ऑब्जेक्ट कुंजी तक पहुंच सामान्य रूप से, किसी दिए गए ऑब्जेक्ट के लिए एक ही क्वेरी बनाम कई क्वेरी करना बेहतर होता है। आइए मान लें कि मेरे पास 'बेटे' ऑब्जेक्ट्स का एक गुच्छा है जिसे प्रत्येक 'पिता' के साथ होता है। मुझे सभी 'बेटे' ऑब्जेक्ट मिलते हैं:ऐप इंजन

sons = Son.all() 

फिर, मैं बेटों के उस समूह के लिए सभी पितरों को प्राप्त करना चाहता हूं। मुझे क्या करना:

father_keys = {} 
for son in sons: 
    father_keys.setdefault(son.father.key(), None) 

तो मैं कर सकते हैं:

fathers = Father.get(father_keys.keys()) 

अब, यह है कि son.father.key() मान लिया गया है वास्तव में वस्तु लाने जाना नहीं है। क्या मैं इसके बारे में गलत हूं? मेरे पास कोड का एक समूह है जो ऑब्जेक्ट मानता है .related_object.key() वास्तव में डेटास्टोर से संबंधित_object नहीं लाता है।

क्या मैं यह सही कर रहा हूं?

उत्तर

10

आप ऐप इंजन एसडीके स्रोतों के अपने डाउनलोड में appengine.ext.db के स्रोतों का अध्ययन करके जवाब पा सकते हैं - और उत्तर है, नहीं, आपके पास आवश्यक विशेष कैसिंग नहीं है: __get__ विधि (पंक्ति 2887 में ReferenceProperty के 1.3.0 एसडीके के स्रोत) से पहले .key() या किसी और चीज को परिणामस्वरूप बाद में लागू किया जाएगा, इसलिए इसे आपको अनुकूलन करने का मौका नहीं मिलता है। विधि get_value_for_datastore वास्तव में क्या करता है कि आप क्या चाहते:

हालांकि, लाइन 2929 देखो!

विशेष रूप से, son.father.key() के बजाय, Son.father.get_value_for_datastore(son) का उपयोग करें और आप ज्यादा एक परिणाम ;-) के रूप में खुश होना चाहिए।

+1

किक गधा जवाब। मेरे ऐप को अभी 10x तेज और सस्ता मिला है: डी –

+0

@ सुधीर, खुशी हुई, यह मुझे मदद करने के लिए धन्यवाद, धन्यवाद! -) –

+0

जिसमें से बात करते हैं, जब स्टोर से उन्हें पुनर्प्राप्त किया जाता है तो वस्तुओं को कैश किया जाता है? तो अगर मैंने हैंडलर में Father.get (all_keys) किया, तो क्या रनटाइम टेम्पलेट में उन्हें फिर से लाने की कोशिश करेगा अगर मैं सिर्फ अपने पिता के साथ बेटों को प्रिंट कर रहा हूं? –

1

मैं बेटों के माध्यम से लूप करना चाहता हूं और son.parent_key() का उपयोग करके माता-पिता की चाबियाँ प्राप्त करूंगा।

parent_key()

इस उदाहरण की मूल इकाई के प्रमुख, या कोई नहीं करता है, तो इस उदाहरण एक जनक नहीं है देता है।

Since all the path is saved in the instance's key, सैद्धांतिक रूप से, डेटाबेस फिर से हिट करने के लिए माता-पिता की कुंजी प्राप्त करने के लिए कोई जरूरत नहीं है।

इसके बाद, का उपयोग कर पर सभी माता-पिता के उदाहरण प्राप्त करना संभव है।

प्राप्त (कुंजी)

संस्था या किसी कुंजी या कुंजियों, किसी भी मॉडल के लिए संस्थाओं हो जाता है।

तर्क:

कुंजी एक चाबी वस्तु या कुंजी वस्तुओं की एक सूची।

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