Python 为什么对象的键是无的?
这是我的班级结构Python 为什么对象的键是无的?,python,google-app-engine,Python,Google App Engine,这是我的班级结构 class Mapping(ndb.Model): id = ndb.StringProperty() code = ndb.StringProperty() class Doc(ndb.Model): mappings = ndb.StructuredProperty('Mapping', repeated=True) 我的代码将扫描某个数据集以创建一系列映射,并添加到Doc的实例中。最后,根据一定的条件,我将决定是否保存Doc实例 doc = Doc(
class Mapping(ndb.Model):
id = ndb.StringProperty()
code = ndb.StringProperty()
class Doc(ndb.Model):
mappings = ndb.StructuredProperty('Mapping', repeated=True)
我的代码将扫描某个数据集以创建一系列映射,并添加到Doc
的实例中。最后,根据一定的条件,我将决定是否保存Doc
实例
doc = Doc()
for data in dataset:
m = Mapping(parent=doc) # need to be able to reference the parent
m.put() # Did key get instantiated?
doc.mappings.append(m)
if good:
doc.put()
问题是:
当我尝试迭代doc.mapping
的映射列表时,我想打印出映射实例的键
print m.key.id()
但我将收到以下错误消息:
AttributeError: 'NoneType' object has no attribute 'id'
为什么在调用
put
方法后没有实例化“key”?为存储在StructuredProperties中而创建的模型没有key。这些实体被序列化并存储在对象的属性中。如果它们已被索引,则可以对其进行查询,但它们不作为独立的数据存储实体存在,因此没有键。更多的信息可以在中找到,但是你必须在字里行间读一些。查看数据存储查看器中存储的实体,您还将看到没有为这些属性创建键
即使放置()模型,它们的关键组件也不会保留在mapping属性中
在您的情况下,为了实现您所尝试的,您应该将映射的键存储为repeatedKeyProperty,而不是StructuredProperty
深入探究原因,,您可以在代码中查找并查看
\u retrieve\u value
的实现。这使用模型的\u values
属性将实体序列化为dict,以存储在StructuredProperty中,而键在\u values
中不存在,对此我不确定,但您尚未将密钥放入父级,因此父级的密钥为“无”。父项的键是子项的键的一部分,因此您还不能创建子项的键是有意义的。然而,你能把孩子放在床上真是奇怪。一定是在后台进行了一些奇怪的应用程序引擎优化。如果你把父母放进去呢?那么它能工作吗?为什么您认为对象m
应该有一个属性键
?