2013-05-31 3 views
14

शामिल नहीं है I किसी ऑब्जेक्ट की गुणों को एक अजगर के रूप में परिवर्तित करने के लिए ndb की to_dict विधि का लाभ उठा रहा हूं। सब कुछ से मैं बता सकता हूँ, इस विधि प्रलेखन के अनुसार dict भीतर वस्तु के प्रमुख या माता-पिता शामिल नहीं है:ndb to_dict विधि में ऑब्जेक्ट की कुंजी

https://developers.google.com/appengine/docs/python/ndb/modelclass#Model_to_dict

हालांकि मेरी स्थिति के लिए मैं कुंजी की आवश्यकता dict में किया जाना है। मेरी वरीयता बिल्टिन विधि का लाभ उठाने और इसे अपने स्वयं के to_dict विधि बनाने के बजाय समान या कुछ समान उपक्रम करना होगा।

इसे पूरा करने का सबसे अच्छा तरीका क्या है या क्या मुझे कुछ याद आ रही है? अग्रिम में धन्यवाद।

एफवाईआई: मैं इस परियोजना के लिए django का लाभ नहीं उठा रहा हूं बल्कि इसके बजाय सीधे पायथन को तैनात किया गया है।

उत्तर

29

तुम कुछ भी याद आ रही नहीं कर रहे हैं ;-)

बस शब्दकोश के बाद आप to_dict कॉल करने के लिए कुंजी जोड़ने के लिए, और हाँ विधि ओवरराइड।

यदि आपके पास कई मॉडल हैं जो आपके कस्टम to_dict के साथ समान बेस क्लास साझा नहीं करते हैं, तो मैं इसे एक मिश्रण के रूप में कार्यान्वित करता हूं।

एक मिक्सिन वर्ग की विधि के रूप में to_dict को परिभाषित करने के लिए। आप

class ModelUtils(object): 
    def to_dict(self): 
     result = super(ModelUtils,self).to_dict() 
     result['key'] = self.key.id() #get the key as a string 
     return result 

फिर इसका उपयोग करने के लिए।

class MyModel(ndb.Model): 

    # this property always returns the value of self.key.id() 
    uid = ndb.ComputedProperty(lambda self: self.key.id(), indexed=False) 

    # other properties ... 

एक ComputedPropertyto_dict का परिणाम में जोड़ दिया जाएगा:

class MyModel(ModelUtils,ndb.Model): 
    # some properties etc... 
+0

धन्यवाद टिम! पूरी तरह से काम किया। मैं अजगर के लिए नया हूं और जैसा कि आप उल्लेख करते हैं, विधि को ओवरराइड करने के बारे में नहीं जानते। मैं इसे एक और प्रश्न के रूप में पोस्ट कर सकता हूं जबतक कि आप अपना उत्तर संपादित करने और कुछ मार्गदर्शन प्रदान करने के इच्छुक नहीं हैं। मैं त्वरित प्रतिक्रिया की सराहना करता हूं और यहां आपके सभी अन्य उत्तरों के माध्यम से स्टैक पर सीखने का आनंद लिया है। –

+0

उदाहरण के लिए संपादन देखें। –

+0

डांके सर। मुझे भी मदद मिली –

2

कि प्राप्त करने के लिए (to_dict ओवरराइड करने के लिए बिना) एक और आसान तरीका एक ComputedProperty कि आईडी देता है, तो जैसे जोड़ने के लिए है किसी भी अन्य संपत्ति की तरह।

  1. जाहिर गुण का नाम key नहीं किया जा सकता (क्योंकि वास्तव में वही कुंजी के साथ संघर्ष होगा) और id या तो काम नहीं करता:

    सिर्फ दो की कमी कर रहे हैं।

  2. यदि आप ऑब्जेक्ट बनाते हैं तो आप कोई कुंजी या आईडी निर्दिष्ट नहीं करते हैं तो यह काम नहीं करेगा।

इसके अलावा, परिकलित मान, डेटा संग्रह करने के लिए लिखा जाएगा जब आप put() फोन तो यह आपके कुछ संग्रहण स्थान का सेवन करता है।

एक फायदा यह है कि यह include और exclude बॉक्स के बाहर to_dict() के तर्कों का समर्थन करता है।

+0

प्रारंभ में एक इकाई बनाने के दौरान यह काम नहीं प्रतीत होता है क्योंकि कुंजी अभी तक परिभाषित नहीं की गई है। मुझे यह त्रुटि मिल रही है: 'uid = ndb.ComputedProperty (lambda self: self.key।आईडी()) विशेषताएँ त्रुटि: 'noneType' ऑब्जेक्ट में कोई विशेषता नहीं है 'id'' – Stetzon

+0

सही, यही मेरा मतलब है कि मेरे उत्तर में बाधा # 2 है। जब यह कार्य करने के लिए ऑब्जेक्ट बनाया जाता है तो आपको एक कुंजी असाइन करनी होगी। कम से कम मेरे उपयोग मामलों में जो कोई मुद्दा नहीं है। – Marten

+0

हाँ, मैंने अपनी टिप्पणी पोस्ट करने के बाद इसे लगभग ठीक से पकड़ा। पहली बार अपने नोट को याद किया होगा। स्पष्टीकरण के लिए धन्यवाद। मैं प्रारंभिक _put_ से पहले इकाई को एक कुंजी [आवंटित और असाइन करना] (https://cloud.google.com/appengine/docs/python/ndb/creating-entity-keys#allocating_ids) द्वारा काम करने में सक्षम था। – Stetzon

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