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

时间:2014-01-16 23:20:51

标签: 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)

如果我有一个名为Z的{​​{1}}类型的对象,那么我可以通过调用z来获取密钥。假设我在z.key字段引用中添加了一些对象,那么如何遍历以获取zX类型的对象的键?

我已尝试Yz.refs[0].key,但他们返回无。我可以参考z.refs[0].ref.keyz.refs[0].field2就好了。

我曾尝试将StructuredProperty切换为LocalStructuredProperty,但这并未改变任何内容。

1 个答案:

答案 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实体。