在将实体保存到ndb之前通过其键引用实体

时间:2014-03-07 15:08:27

标签: python google-app-engine google-cloud-datastore

我希望能够在创建两个实体时将一个类的实体与另一个实体相关联(一个实体将另一个实体作为其父级,另一个实体将具有指向另一个实体的键) )。在将实体保存到数据存储区之前,我似乎无法获取实体的密钥。有没有办法实现上述目的而无需两次保存其中一个实体?

以下是示例:

class A(ndb.Model):
    key_of_b = ndb.KeyProperty(kind='B')

class B(ndb.Model):
    pass

我想做什么:

a = A()
b = B(parent=a.key)
a.key_of_b = b.key

a.put()
b.put()

如果在保存实体之前没有分配密钥,那么我是否可以自己构建它?有没有办法实现这一点,或者唯一的解决方案是两次保存其中一个实体?

1 个答案:

答案 0 :(得分:3)

您可以使用命名键执行此操作,但您必须确保可以使用唯一键命名这两个实体:

# It is possible to construct a key for an entity that does not yet exist.
keyname_a = 'abc'
keyname_b = 'def'
key_a = ndb.Key(A, keyname_a)
key_b = ndb.Key(A, keyname_a, B, keyname_b)

a = A(id=keyname_a)
a.key_of_b = key_b
b = B(id=keyname_b, parent=key_a)

a.put()
b.put()

但是,我建议您首先考虑为什么需要key_of_b属性。如果您只将A设置为B的父级,那么您始终可以从A导航到B,反之亦然:

# If you have the A entity from somewhere and want to find B.
b = B.query(ancestor=entity_a.key).get()

# You have the B entity from somewhere and want to find A.
a = entity_b.key.parent().get()

这也为您提供了在AB之间创建一对多关系的机会。