【问题标题】:NDB: How to do a partial ancestor match?NDB:如何进行部分祖先匹配?
【发布时间】:2014-02-13 12:55:07
【问题描述】:

上下文:

我正在开发一个网络应用程序。 如果我不使用祖先,则在立即插入 ndb.Model 的新值后尝试更新元素不会获取新值。 不过,使用祖先,我得到了一致的结果。

但是,我想创建项目的层次结构。

例子:

class Office(ndb.Expando):
  name = ndb.StringProperty()

鉴于办公室:

HQ = Office(key=ndb.Key('Office', '0'), name='HQ')
BR1 = Office(key=ndb.Key('Office', '0','Office', 'BR1'), name='Branch 1')
BR2 = Office(key=ndb.Key('Office', '0', 'Office', 'BR2'), name='Branch 2')
BR1S1 = Office(key=ndb.Key('Office', 'S1'), name='Branch 1 Sector 1')
BR1S2 = Office(key=ndb.Key('Office', 'S2'), name='Branch 1 Sector 2')
BR2S1 = Office(key=ndb.Key('Office', 'S1'), name='Branch 2, Sector 1')
BR2S1 = Office(key=ndb.Key('Office', 'S2'), name='Branch 2, Sector 2')

我无法获得强一致性,因为它们都是根祖先。

鉴于办公室:

HQ = Office(key=ndb.Key('Office', '0'), name='HQ')
BR1 = Office(key=ndb.Key('Office', '0','Office', 'BR1'), name='Branch 1')
BR2 = Office(key=ndb.Key('Office', '0', 'Office', 'BR2'), name='Branch 2')
BR1S1 = Office(key=ndb.Key('Office', '0', 'Office', 'BR1','Office', 'S1'), name='Branch 1 Sector 1')
BR1S2 = Office(key=ndb.Key('Office', '0', 'Office', 'BR1','Office', 'S2'), name='Branch 1 Sector 2')
BR2S1 = Office(key=ndb.Key('Office', '0', 'Office', 'BR2','Office', 'S1'), name='Branch 2, Sector 1')
BR2S1 = Office(key=ndb.Key('Office', '0', 'Office', 'BR2','Office', 'S2'), name='Branch 2, Sector 2')

我也无法从单个查询中获取所有这些,因为祖先参数只能完全匹配。

我想查询祖先ndb.Key('Office', '0', *),但不知道怎么做。

有可能吗?

【问题讨论】:

  • 你试过祖先查询吗?因为无论深度如何,它都匹配所有孩子。另外,如果你刚刚插入了一个实体,那么你就有了key,如果你需要做一个后续更新,为什么不通过key来获取item,那么它将是一致的。

标签: python google-app-engine app-engine-ndb


【解决方案1】:

Ancestor Querys

key = ndb.Key(BlogPost, 12345)
qry = Comment.query(ancestor=key)

所以你的例子是

key = ndb.Key(Office, 0)
qry = Office.query(ancestor=key)

【讨论】:

  • 问题是这只适用于根祖先。如果我尝试key = ndb.Key(Office, 'BR1'),我什么也得不到。
  • ndb.Key(Office, 'BR1') 不是祖先。您真的应该重新阅读有关键的文档以及祖先的组成部分。您正在尝试匹配路径中某处的某个键,这是无法完成的。如果要这样做,则需要将键(路径)的所有元素存储在重复键属性中,然后在该属性中查询键。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-26
  • 2013-06-16
  • 2012-09-19
  • 1970-01-01
  • 1970-01-01
  • 2020-03-27
相关资源
最近更新 更多