我有这些课程:
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
的{{1}}类型的对象,那么我可以通过调用z
来获取密钥。假设我在z.key
字段引用中添加了一些对象,那么如何遍历以获取z
和X
类型的对象的键?
我已尝试Y
和z.refs[0].key
,但他们返回无。我可以参考z.refs[0].ref.key
和z.refs[0].field2
就好了。
我曾尝试将StructuredProperty切换为LocalStructuredProperty,但这并未改变任何内容。
答案 0 :(得分:0)
每the documentation on structured models,
虽然(结构化模型)实例使用与模型类相同的语法定义,但它们不是完整的实体。他们在数据存储区中没有自己的密钥。它们无法独立于它们所属的......实体进行检索。
它的工作原理是,当您使用结构化属性创建实体时,结构化属性将扩展为包含它的实体的新属性。将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值之一,则相应的refs.ref.field1 / refs.field2值存储在Z实体不会更新,因为Z中的值不会以任何方式链接回原始的X / Y实体。