मैं db.Model
से ndb.Model
पर माइग्रेशन की प्रक्रिया में हूं। इस माइग्रेशन को समाप्त करने से पहले मुझे हल करने का एकमात्र मुद्दा यह है कि Model.is_saved
विधि नहीं है। मैं संस्थाओं आदिक्या डेटाडेटोर में मॉडल लगातार है या नहीं, तो एनडीबी के साथ निर्धारित करना संभव है?
प्रलेखन कहते हैं ndb.Model
is_saved
विधि के लिए कोई समकक्ष है कि बनाने पर विरोध हुआ चाबी के लिए जाँच करने के लिए अपने आवेदन में db.Model.is_saved
का इस्तेमाल किया है निर्धारित करने के लिए sharded काउंटरों put
/delete
पर अद्यतन किया जाना चाहिए अगर,। मैं के बजाय get_or_insert
के साथ कुछ उपयोग मामलों को फिर से कार्यान्वित कर सकता हूं। पर उनमें से सभी नहीं।
एक गंदे हैक के रूप में मैं कन्स्ट्रक्टर को कॉल करके बनाए गए हर उदाहरण के लिए _in_memory_instance
जैसे ध्वज सेट कर सकता हूं। लेकिन यह मेरी समस्या का समाधान नहीं करता है। मुझे अभी भी प्रत्येक put()
कॉल के बाद कम से कम इस ध्वज को अपडेट करना होगा।
सवाल यह है कि क्या यह निर्धारित करने का बेहतर तरीका है कि मॉडल डेटास्टोर में लगातार है या नहीं, अतिरिक्त डेटास्टोर हिट के बिना?
संपादित करें 1: उल्लेख करने के लिए भूल गए: सभी इकाइयों को कुंजी मिल गई है इसलिए Model._has_complete_key()
मेरे लिए काम नहीं करता है।
संपादित करें 2: इस चर्चा के बाद https://groups.google.com/d/topic/google-appengine/Tm8NDWIvc70/discussion यह मेरी समस्या का समाधान करने का एकमात्र तरीका है _post_get_hook
/_post_put_hook
का उपयोग करना। मैं सोच रहा हूं कि आधिकारिक एपीआई में ऐसी छोटी सी चीज़ क्यों शामिल नहीं थी।
संपादित करें 3: मैं अपने सभी मॉडलों के लिए अगले बेस क्लास के साथ समाप्त हुआ। @Tim Hoffmans विचार के आधार पर
class BaseModel(ndb.Model):
@classmethod
def _post_get_hook(cls, key, future):
self = future.get_result()
if self:
self._is_saved = bool(key)
def _post_put_hook(self, future):
self._is_saved = future.state == future.FINISHING
def is_saved(self):
if self._has_complete_key():
return getattr(self, "_is_saved", False)
return False
क्या आप यह जांच सकते हैं कि ऑब्जेक्ट में वास्तव में कोई कुंजी/आईडी है या नहीं? (संभवतः एक कोशिश/खंड को छोड़कर)। एनडीबी मॉडल वर्ग से परिचित नहीं है, लेकिन मुझे याद है कि डीबी.मोडेल एक त्रुटि उठाता है (या कोई नहीं देता है?) यदि आप सहेजने से पहले मॉडल उदाहरण की आईडी/कुंजी प्राप्त करने का प्रयास करते हैं (या संभवतः यह 'कोई नहीं' लौटाता है)। ऐसा मत सोचो कि डेटास्टोर हिट के साथ खत्म हो जाएगा। यदि यह काम करता है, तो आप केवल एक ऐसी संपत्ति लिख सकते हैं जो 'def is_saved (self) जैसा है: वापस self.key() कोई नहीं है (या इसे एक कोशिश/निकालने के साथ करें जो एक अपवाद उठाया गया है और अन्यथा झूठा है)। –
कुंजी की जांच करने से कोई काम नहीं होने पर काम नहीं करेगा। एक संभावित विकल्प (लेकिन अपर्याप्त हो सकता है) में creat_date ध्वज है (auto_now_add = True पर सेट करें)। दस्तावेज़ों से "स्वचालित मान तब तक उत्पन्न नहीं होता है जब तक कि इकाई लिखी नहीं जाती है, यानी, ये विकल्प डायनामिक डिफ़ॉल्ट प्रदान नहीं करते हैं।" हालांकि अगर लेखन विफल रहता है तो मान निर्धारित किया जाएगा। यद्यपि आपको पता होना चाहिए कि लेखन विफल रहा है ;-) –
वैकल्पिक रूप से _post_put_hook का उपयोग अपने ध्वज को इंगित करने के लिए करते हुए इंगित करता है कि यह सहेजा गया था। –