我有以下课程:
class Setting(ndb.Model):
key = ndb.StringProperty(indexed=False, repeated=False)
name = ndb.StringProperty(indexed=False, repeated=False)
value = ndb.BooleanProperty(indexed=False, repeated=False, default=False)
class MessageSettings(ndb.Model):
settings = ndb.StructuredProperty(Setting, indexed=False, repeated=True)
值得注意的是,我的Setting
类有一个名为key
的字段。但是,在ndb
documentation中,它指出:
不要说出一个属性" key。"此名称保留用于存储Model键的特殊属性。虽然它可以在本地工作,但是一个名为" key"将阻止部署到App Engine。
这不是我的经验。我可以部署我的应用程序,我的应用程序按预期执行。话虽这么说,我从未明确地在数据存储区中放置Setting
实体。
有什么想法吗?
答案 0 :(得分:0)
看一下model.py
,特别是Model
类,我们发现构建一个对象是分开的:
put
的对象。put
的对象。前一种情况可能导致问题。让我们看看为什么会这样:
首次实例化Model
对象时,其key
设置为None
。但是,如果对象具有属性key
,则将其设置为在实例化对象时提供给构造函数的任何内容。
假设我将以下kwargs
传递给我的Setting
课程:
kwargs = {
'key': 'key',
'name': 'name',
'value': False,
}
s = Setting(**kwargs)
s.key
将等于字符串key
。
在Model
类中,我们发现设置了key
的伪属性:
_key = ModelKey()
key = _key
但是,当Model
被实例化时,key
被设置为在实例化对象时提供给构造函数的值。在这种情况下,_key
的{{1}}伪属性Model
设置为用于指定此实体的key
对象:
Key
粗略搜索self._key = Key(self._get_kind(), id,
parent = parent, app = app, namespace = namespace)
的使用情况表明它未在self.key
中使用。在put()
对象本身上调用get()
方法,因此Key
类不起任何作用。
鉴于此,似乎是警告:
注意:您无法定义名为 key 的属性;
Model
属性始终引用实体的密钥。但您可以定义名为 id 或 parent 的属性。后者的值不能通过构造函数传递,但可以在创建实体后分配给实体属性。
很有意义,但不是必要的。
此外,由于我创建的类永远不应该在数据存储区中显式.key
,所以我只是定义了一个put
来引发异常,如果发生了这种情况:
_pre_put_hook