【问题标题】:Appengine: TypeError: 'NoneType' object does not support item assignmentAppengine:TypeError:“NoneType”对象不支持项目分配
【发布时间】:2013-12-05 07:59:31
【问题描述】:

通过构造函数赋值。但得到“TypeError:'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
TypeError: 'NoneType' object does not support item assignment

【问题讨论】:

  • 不确定是否重要,但也许您应该先致电ndb.Model.__init__(self)。 (或者您可能使用super)...这可能会将entity._values 设置为None 以外的其他值...
  • @mgilson ndb.Model.__init__(self) 可以。 Btb 我怎样才能为上面的代码添加一个 key_name ?
  • key_name?你这是什么意思?
  • 我的意思是像 a = test(id='unique_id') 这样的实体 ID。并通过test.get_by_id('unique_id') 获取该实体
  • 此外,这个 init 方法是完全多余的,因为您可以使用 default="Test Status" 设置属性的默认值

标签: python google-app-engine app-engine-ndb


【解决方案1】:

您可能需要通过调用__init__ 来正确初始化ndb.Model

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

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

【讨论】:

    【解决方案2】:

    如果你想传递任何参数,你需要这样做

    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')
    

    不过,我不确定 status 的事情。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-10-17
      • 2020-10-30
      • 1970-01-01
      • 2015-03-09
      • 2019-01-03
      • 2016-06-03
      相关资源
      最近更新 更多