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
应该有一个属性