2010-05-02 7 views
9

में विधियों को सहेजें, डालें, प्राप्त करें ... ओवरराइड करें Google App Engine में db.Model के लिए मेथिड्स को ओवरराइड करना संभव है? मैं स्वचालित टैगिंग सिस्टम बनाने के लिए पहले सेव, सहेजने के तरीके, आदि के बारे में घोषणा करना चाहता हूं।Google App Engine

मुझे पता है कि हुक रहे हैं, लेकिन यह मेरे लिए इस मुद्दे :)

धन्यवाद हल करने के लिए एक गलत तरीका लगता है!

उत्तर

13

हां, इन विधियों को ओवरराइड करना संभव है। इस लग रहा है इस blog post by Nick Johnson व्याप्ति शौकीन मॉडल वर्ग पर एक नज़र डालें:

class HookedModel(db.Model): 
    def before_put(self): 
    pass 

    def after_put(self): 
    pass 

    def put(self, **kwargs): 
    self.before_put() 
    super(HookedModel, self).put(**kwargs) 
    self.after_put() 

ब्लॉग पढ़ें भी db.put() विधि को संभालने के लिए कैसे को देखने के लिए।

आपको "derived properties" पर भी रुचि हो सकती है।

+5

मुझे वास्तव में तेज़ी से जाना होगा। ;) –

+0

डाल() को एक कुंजी वापस करनी चाहिए - मैंने इसे जोड़ने के लिए इस उत्तर में एक संपादन सबमिट किया है। – wodow

+0

@ वाहो, यह आपके लिए अपना कोड जोड़ने के लिए किसी और के कोड को संपादित करने के लिए स्वीकार्य नहीं है * विशेष रूप से अगर यह स्वीकार्य उत्तर * है। यदि आप वास्तव में महसूस करते हैं कि आपके पास कुछ जोड़ने के लिए है, तो या तो अपना स्वयं का उत्तर जोड़ें, या उत्तर लेखक से उनके कोड को समायोजित करने के लिए कहें। मैंने आपके संपादन को वापस ले लिया है। – Sheridan

1

मैं इतना है कि before_put और after_put तरीकों को सही ढंग से कार्य की _async परिवार जब db.put() से कहा जाता है और लागू कर रहे हैं jbochi के HookedModel वर्ग के लिए एक विस्तार था।

देखें AppEngine PreCall API hooks

1

मैं @jbochi द्वारा जवाब में सुधार करने का प्रयास किया:

  1. https://developers.google.com/appengine/docs/python/datastore/modelclass#Model_put के अनुसार, put() एक Key वापसी करना चाहिए, ताकि पुस्तकालय से वापसी मान के माध्यम से पारित किया जाना चाहिए । तो मैन्युअल रूप से संभाला जाना चाहिए -
  2. db.Model.save(), जबकि पदावनत, (क) कभी कभी अभी भी प्रयोग किया, (ख) put() के लिए एक पर्याय और (ग) जाहिरा तौर पर सीधे put() से बुलाया नहीं होना है।

संशोधित कोड:

class HookedModel(db.Model): 
    def before_put(self): 
    pass 

    def after_put(self): 
    pass 

    def put(self, **kwargs): 
    self.before_put() 
    result = super(HookedModel, self).put(**kwargs) 
    self.after_put() 
    return result 

    def save(self, **kwargs): 
    self.before_put() 
    result = super(HookedModel, self).save(**kwargs) 
    self.after_put() 
    return result 

तुम अब भी http://blog.notdot.net/2010/04/Pre--and-post--put-hooks-for-Datastore-models पढ़ आप monkeypatching, या async तरीकों के उपयोग के लिए क्रिस FARMILOE का जवाब उपयोग करना चाहते हैं चाहिए।

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

  • कोई संबंधित समस्या नहीं^_^