是否有其他方式/策略可用于实现与提供的相同" transaction"在GAE Python中? 在GAE,"交易"有助于确保事务中的所有NDB操作成功或全部回滚 我不能使用" transaction"由于实体组计数限制为5(xg),在我的代码中的许多地方,我认为需要它 感谢你的时间。
其中一个用例
class A(ndb.Model):
:: # Some Properties
class B(ndb.Model):
:: # Some Properties
class C(ndb.Model):
:: # Some Properties
class D(ndb.Model):
:: # Some Properties
class E(ndb.Model):
:: # Some Properties
class F(ndb.Model):
:: # Some Properties
class G(ndb.Model):
:: # Some Properties
class create_new_x (BaseRequestHandler):
@ndb.toplevel
def get(self):
::
a1 = A (id="x", p1=v1, .. , pn=vn)
a1.put_async ()
b1 = B (id="y", p1=v1, .. , pn=vn)
b1.put_async ()
::
g1 = G (id="z", p1=v1, .. , pn=vn)
g1.put_async ()
return
当我创建Model" A"的新实体(例如" A1")时,我也创建实体(例如," B1",&# 34; C1",D1"," E1"," F1"," G1")模型" B", " C"," D"," E"," F"," G"在同一个用户请求中。 我不想为实体分配父母" B1"," C1",D1"," E1"," F1" ," G1"。如果我将它们分配给父母(作为" A1"),那么我必须先得到" A1"每当我想得到任何" B1"," C1",D1"," E1"," F1",&# 34; G1&#34 ;.这是因为我们需要在" get_by_id"中指定祖先键。
答案 0 :(得分:1)
您可以通过手动构建密钥来检索实体,包括祖先路径:
rev_key = ndb.Key('Account', 'Sandy', 'Message', 'greeting', 'Revision', '2')
address = ndb.get(rev_key)
您还可以使用命名参数parent
直接指定祖先路径中的任何实体。
k2 = ndb.Key(Revision, '2', parent=ndb.Key('Account', 'Sandy', 'Message', 'greetings'))
链中的父级不一定存在以便以这种方式使用它,但是通常您可以创建它(例如,作为父级的作者作为子项的作者)作为设置的一部分。但如果它的名字可以提前确定,你可以使用它。
您可以将数据存储区查询过滤到指定的祖先,以便这样做 返回的结果将仅包括来自该实体的实体 祖先
https://developers.google.com/appengine/docs/python/ndb/entities