谷歌应用引擎ndb:put()然后查询(),总有一个项目

Ran*_*ang 10 google-app-engine

我想知道是否有人在Google App Engine的NDB上遇到了这个奇怪的问题:在创建一个新实体并将其保存之后put(); 然后query()立即减少一件物品.例如,

class Item(ndb.Model):
    ...
    ...

items = Item.query().fetch()
length1 = len(items)
item = Item()
item.put()
items = Item.query().fetch()
length2 = len(items)
Run Code Online (Sandbox Code Playgroud)

在上面,length1总是等于length2.但是,length2稍后重新访问同一HTML页面时将予以更正.问题是什么?谢谢.

Jes*_*sak 21

这是预期的行为; 您上面的查询最终只是一致的.也就是说,查询时无法保证获得最新结果.

您可以使用祖先查询来解决此问题(请参阅上面的链接).对于您的示例,您需要为每个项目提供父实体,然后使用Item.query().ancestor(theParentEntity).fetch().


Eag*_*gle 8

正如@JesseRusak所说,你需要一个虚拟的祖先来解决这个小问题(我最近遇到了同样的问题).

但我没有制作新的DummyEntity,只是DummyAncestor的DummyKey.试试这个问题:

class Item(ndb.Model): ... ... items = Item.query(ancestor=ndb.Key(Item, 'Items')).fetch() length1 = len(items) item = Item(parent=ndb.Key(Item, 'Items')) item.put() items = Item.query(ancestor=ndb.Key(Item, 'Items')).fetch() length2 = len(items)

至少在我的情况下,DummyAncestor工作了.


The*_*AWS -3

我通过进行适当的查询、创建新的模型记录、然后在返回之前将其附加到我的查询中来解决这个问题。修改你的,它看起来像:

class Item(ndb.Model):
    ...
    ...

items = Item.query().fetch()
length1 = len(items)
item = Item()
item.put()

appended_items = list()
for existing_item in items:
    appended_items.append(existing_item)

appended_items.append(item)
length2 = len(appendeditems)
Run Code Online (Sandbox Code Playgroud)

在本例中,append_items 包含您的查询以及新元素。列表生成效率低下,但我是一个 python/ndb 菜鸟,可能有一种方法可以从查询模型中获取集合,这会好得多。

  • 编写的代码可能会产生重复。(新项目可能实际上在查询结果中返回。)如果您的查询需要排序/过滤等,它也将无法正常工作。 (2认同)