GAE(Python):如何从StructuredProperty获取密钥?

GAE(Python):如何从StructuredProperty获取密钥?,python,google-app-engine,Python,Google App Engine,我有以下课程: class X(ndb.Model): field1 = ndb.StringProperty(indexed=True) class Y(ndb.Model): ref = ndb.StructuredProperty(X) field2 = ndb.StringProperty(indexed=False) class Z(ndb.Model): refs = ndb.StructuredProperty(Y, repeated=True) 如果我有一个

我有以下课程:

class X(ndb.Model):
  field1 = ndb.StringProperty(indexed=True)

class Y(ndb.Model):
  ref = ndb.StructuredProperty(X)
  field2 = ndb.StringProperty(indexed=False)

class Z(ndb.Model):
  refs = ndb.StructuredProperty(Y, repeated=True)
如果我有一个名为
Z
Z
类型的对象,那么我可以通过调用
Z.key
来获取该对象的密钥。假设我在
z
字段引用中添加了一些对象,那么如何遍历这些对象以获取
X
Y
类型的对象的键

我尝试了
z.refs[0].key
z.refs[0].ref.key
,但它们都没有返回。我可以参考
z.refs[0].field2
z.refs[0].ref.field1
很好

我尝试将StructuredProperty切换到LocalStructuredProperty,但没有任何改变。

Per

尽管(结构化模型)实例是使用与模型类相同的语法定义的,但它们不是成熟的实体。他们在数据存储中没有自己的密钥。它们无法独立于。。。它们所属的实体

它这样工作的原因是,当您使用结构化属性创建实体时,结构化属性将扩展为包含它的实体上的新属性。将Z实体保存到数据存储后,请查看数据存储查看器,您将看到该实体的类似内容:

Entity Key: ahxkZXZ-ZG9tYWluLW1hcmtldHBsYWNlLWRlYnVncg4LEgFaGICAgICAgOAJDA
ID: 5488762045857792
refs.field2 (list): [u'y1', u'y2']
refs.ref.field1 (list): [u'x1', u'x2']

另外,您会注意到,如果更改保存到数据存储中的X/Y实体的其中一个field1/field2值,则存储在Z实体中的相应refs.ref.field1/refs.field2值将不会更新,由于Z中的值没有以任何方式链接回原始X/Y实体。

如果我希望能够获取关键帧并查看field1/field2中的更改,我最好的选择是使用KeyProperty,然后手动查询SubjectObjects中的field2、子对象和field1吗?