Appengine: TypeError: 'noneType' ऑब्जेक्ट आइटम असाइनमेंट का समर्थन नहीं करता है

कन्स्ट्रक्टर के माध्यम से एक मूल्य असाइन करने के लिए ट्रिंग। लेकिन "Typeत्रुटि:'noneType' ऑब्जेक्ट प्राप्त करने से आइटम असाइनमेंट का समर्थन नहीं होता है"।

import webapp2
from google.appengine.ext import ndb

class test(ndb.Model):
    status = ndb.StringProperty(default=None)

    def __init__(self):
         self.status = "Test Status"


class MainPage(webapp2.RequestHandler):
     def get(self):
          a = test()
          a.put()           


app = webapp2.WSGIApplication([('/', MainPage)], debug=True)

त्रुटि:

  File "/home/user/Appengine/guestbook/guestbook.py", line 15, in get
    a = test()
  File "/home/user/Appengine/guestbook/guestbook.py", line 10, in __init__
    self.status = "Test Status"
  File "/home/user/google_appengine/google/appengine/ext/ndb/model.py", line 1265, in __set__
    self._set_value(entity, value)
  File "/home/user/google_appengine/google/appengine/ext/ndb/model.py", line 1011, in _set_value
    self._store_value(entity, value)
  File "/home/user/google_appengine/google/appengine/ext/ndb/model.py", line 992, in _store_value
    entity._values[self._name] = value
Typeत्रुटि:'NoneType' object does not support item assignment
0
यह सुनिश्चित नहीं है कि यह महत्वपूर्ण है, लेकिन शायद आपको ndb.Model .__ init __ (self) पहले कॉल करना चाहिए। (या आप शायद सुपर ) का उपयोग कर सकते हैं ... यह entity._values ​​ को none के अलावा किसी अन्य चीज़ पर सेट कर सकता है ...
जोड़ा लेखक mgilson, स्रोत
KEY_NAME? उससे तुम्हारा क्या मतलब है?
जोड़ा लेखक mgilson, स्रोत
आह ... यह मेरे लिए सही लग रहा है। क्या तुमने कोशिश की?
जोड़ा लेखक mgilson, स्रोत
@mgilson ndb.Model .__ init __ (स्वयं) taht काम करता है। बीटीबी मैं उपरोक्त कोड के लिए एक key_name कैसे जोड़ सकता हूं?
जोड़ा लेखक Nijin Narayanan, स्रोत
मेरा मतलब है कि इस तरह की आईडी आईडी a = test (id = 'unique_id') । और test.get_by_id ('unique_id') द्वारा उस इकाई को पुन: प्राप्त करें
जोड़ा लेखक Nijin Narayanan, स्रोत
पूरी तरह से आपको init को ओवरराइड करने से बचना चाहिए, यदि आप SO के माध्यम से कुछ खोज करते हैं तो आपको मेटाकल्स का उपयोग करने के तरीके के कारण लोगों को init का उपयोग करने के साथ कई समस्याएं मिलेंगी। यदि आप वास्तव में इस प्रकार की कार्यक्षमता चाहते हैं तो आपको कारखाने का उपयोग करने पर विचार करना चाहिए (तत्काल करने और अन्य सामान करने के लिए कक्षा विधि)
जोड़ा लेखक Tim Hoffman, स्रोत
साथ ही यह init विधि पूरी तरह से अनावश्यक है क्योंकि आप डिफ़ॉल्ट = "परीक्षण स्थिति" का उपयोग करके संपत्ति का डिफ़ॉल्ट मान सेट कर सकते हैं
जोड़ा लेखक Tim Hoffman, स्रोत

2 उत्तर

आपको शायद __ init __ को कॉल करके ndb.Model को ठीक से प्रारंभ करने की आवश्यकता है:

class test(ndb.Model):
    status = ndb.StringProperty(default=None)

    def __init__(self):
        ndb.Model.__init__(self)
        self.status = "Test Status"
1
जोड़ा

यदि आप किसी भी तर्क को पारित करना चाहते हैं, तो आपको करना होगा

class Test(ndb.Model): # Classes have uppercase first letter...
    status = ndb.StringProperty(default=None)

    def __init__(self, *a, **k):
        super(Test, self).__init__(self)
        self.status = "Test Status"

तो आप करने में सक्षम होना चाहिए

a = Test(foo='bar')

हालांकि, मुझे स्थिति चीज़ के बारे में निश्चित नहीं है।

1
जोड़ा