为什么对象的键是None?

时间:2015-07-05 15:56:34

标签: 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()
   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方法后没有实例化?

1 个答案:

答案 0 :(得分:1)

为在StructuredProperties中存储而创建的模型没有密钥。这些实体被序列化并存储在对象的属性中。您可以查询它们是否已编制索引,但它们不作为独立的数据存储区实体存在,因此不存在密钥。更多信息可以在https://cloud.google.com/appengine/docs/python/ndb/properties#structured中找到,但是你必须在某些行之间阅读。查看数据存储区查看器中的存储实体,您还会看到没有为这些属性创建密钥。

即使您放置了()模型,它们的关键组件也不会保留在映射属性中。

在您的情况下,为了实现您的尝试,您应该将Mapping的键存储为重复的KeyProperty而不是StructuredProperty。

深入研究这个问题的原因,你去寻找代码并查看_retrieve_value的实现,它使用Model的_values属性将实体序列化为存储的dict key

中不存在StructuredProperty和_values