Python 在实体保存到ndb之前,通过其键引用该实体

Python 在实体保存到ndb之前,通过其键引用该实体,python,google-app-engine,google-cloud-datastore,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(pare

我希望能够在创建两个实体时将一个类的实体与另一个实体关联起来(一个实体将另一个实体作为其父实体,另一个实体将有一个指向另一个实体的键)。似乎我无法在实体保存到数据存储之前获取其密钥。是否有任何方法可以在不必两次保存其中一个实体的情况下实现上述目标

下面是一个例子:

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()

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

您可以使用命名键进行命名,但必须确保可以使用唯一键命名两个实体:

# 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\u 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
之间创建一对多关系