我希望能够在创建两个实体时将一个类的实体与另一个实体相关联(一个实体将另一个实体作为其父级,另一个实体将具有指向另一个实体的键) )。在将实体保存到数据存储区之前,我似乎无法获取实体的密钥。有没有办法实现上述目的而无需两次保存其中一个实体?
以下是示例:
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()
如果在保存实体之前没有分配密钥,那么我是否可以自己构建它?有没有办法实现这一点,或者唯一的解决方案是两次保存其中一个实体?
答案 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()
这也为您提供了在A
和B
之间创建一对多关系的机会。