这是我的班级结构
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
方法后没有实例化?
答案 0 :(得分:1)
为在StructuredProperties中存储而创建的模型没有密钥。这些实体被序列化并存储在对象的属性中。您可以查询它们是否已编制索引,但它们不作为独立的数据存储区实体存在,因此不存在密钥。更多信息可以在https://cloud.google.com/appengine/docs/python/ndb/properties#structured中找到,但是你必须在某些行之间阅读。查看数据存储区查看器中的存储实体,您还会看到没有为这些属性创建密钥。
即使您放置了()模型,它们的关键组件也不会保留在映射属性中。
在您的情况下,为了实现您的尝试,您应该将Mapping的键存储为重复的KeyProperty而不是StructuredProperty。
深入研究这个问题的原因,你去寻找代码并查看_retrieve_value
的实现,它使用Model的_values
属性将实体序列化为存储的dict key
_values