2012-07-21 16 views
5

मेरा प्रश्न एक नया मॉडल इकाई बनाने, और फिर तुरंत बाद इसे पढ़ने के लिए सबसे अच्छा तरीका क्या है, है। उदाहरण के लिए,मैं एक नई मॉडल इकाई कैसे बना सकता हूं, और उसके बाद तुरंत इसे पढ़ सकता हूं?

class LeftModel(ndb.Model): 
    name = ndb.StringProperty(default = "John") 
    date = ndb.DateTimeProperty(auto_now_add=True) 

class RightModel(ndb.Model): 
    left_model = ndb.KeyProperty(kind=LeftModel) 
    interesting_fact = ndb.StringProperty(default = "Nothing") 

def do_this(self): 
    # Create a new model entity 
    new_left = LeftModel() 
    new_left.name = "George" 
    new_left.put() 

    # Retrieve the entity just created 
    current_left = LeftModel.query().filter(LeftModel.name == "George").get() 

    # Create a new entity which references the entity just created and retrieved 
    new_right = RightModel() 
    new_right.left_model = current_left.key 
    new_right.interesting_fact = "Something" 
    new_right.put() 

यह अक्सर की तरह एक अपवाद फेंकता है:

AttributeError: 'NoneType' object has no attribute 'key' 

अर्थात नई LeftModel इकाई की पुनर्प्राप्ति असफल रही थी। मुझे इस समस्या का सामना एपेंगेन के साथ कुछ बार हुआ है और मेरा समाधान हमेशा थोड़ा हैकी रहा है। आम तौर पर जब तक इकाई को सफलतापूर्वक पुनर्प्राप्त नहीं किया जाता है, तब तक मैं बस कुछ भी कोशिश या कोशिश करते समय कोशिश करता हूं। मैं यह कैसे सुनिश्चित कर सकते हैं कि मॉडल इकाई हमेशा (जबकि पाश के मामले में) अनंत लूप के जोखिम को चला रहे हैं या मेरी कोड अप खिलवाड़ (बयानों को छोड़कर कोशिश के मामले में) के बिना लिया गया है?

+1

सिर्फ एक कुंजी LeftModel के लिए निर्माण पर बजाय स्वचालित रूप से उत्पन्न एक का उपयोग कर की स्थापना की। –

+1

+1 अच्छी तरह से कहा गया है समस्या – msw

उत्तर

9

क्यों आप एक प्रश्न के माध्यम से वस्तु के तुरंत बाद put() प्रदर्शन किया है लाने के लिए कोशिश कर रहे हैं।

आप new_left आपने अभी बनाया का उपयोग करें और तुरंत new_right करने के लिए इसे new_right.left_model = current_left.key

कारण आप क्वेरी नहीं कर सकता के रूप में आवंटित करने चाहिए तुरंत क्योंकि मानव संसाधन विकास एक अंतिम स्थिरता मॉडल, आप पुट का परिणाम है जिसका अर्थ है का उपयोग करता है होगा घटनाक्रम दिखाई दे। यदि आप एक सतत परिणाम चाहते हैं तो आपको पूर्वजों के प्रश्नों को निष्पादित करना होगा और यह सृष्टि पर कुंजी में एक पूर्वजों का तात्पर्य है। यह देखते हुए कि आप एक पेड़ बना रहे हैं, यह शायद व्यावहारिक नहीं है। मजबूत स्थिरता https://developers.google.com/appengine/docs/python/datastore/structuring_for_strong_consistency

मैं किसी भी कारण है कि तुम सिर्फ अतिरिक्त क्वेरी बिना आपने अभी बनाया इकाई का उपयोग नहीं करते नहीं दिख रहा है के लिए संरचना डाटा के बारे में पढ़ा है।

+0

+1 बढ़ाना के लिए: "मैं इसे कैसे तुरंत बाद पढ़ा करते हैं?" आप नहीं कर सकते, यह एनडीबी का एक डिजाइन लक्ष्य नहीं है और यह एक अच्छा कारण है कि यह तुरंत उपलब्ध नहीं है। – msw

+7

स्पष्टीकरण के लिए: उस कारण से एनडीबी के साथ कुछ लेना देना नहीं है - इन एचआरडी क्वेरी अर्थशास्त्र बैकएंड में लागू किए गए हैं। एनडीबी बस बुरी खबरों के साथ गुजरता है। (क्यों ओपी इस प्रयास कर रहा है के लिए के रूप में:, शायद भी वे मेरे अनुमान किसी भी रूप में रूप में अच्छा कर रहे हैं, लेकिन मैं उम्मीद थी उदाहरण वास्तविक कोड जहां यह हुआ की तुलना में सरल है, और/या वे परीक्षण के कुछ प्रकार लिख रहे हैं ऐप इंजन में एसक्यूएल मुहावरे का अनुवाद कर रहे थे।) –

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

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