我正在开发一个通过GAE提供API的项目,该API将允许用户在一组实体中向前和向后翻页。 我已经查阅了NDB查询文档页面上关于游标的章节,其中包括了一些描述如何在查询结果中向后翻页的示例代码,但它似乎并没有按照预期工作。我正在使用的是GAE Development SDK 1.8.8。
以下是修改过的示例代码版本,其中创建了5个示例实体,获取并打印第一页,进入并打印第二页,然后尝试向后移动并再次打印第一页:
import pprint
from google.appengine.ext import ndb
class Bar(ndb.Model):
foo = ndb.StringProperty()
#ndb.put_multi([Bar(foo="a"), Bar(foo="b"), Bar(foo="c"), Bar(foo="d"), Bar(foo="e")])
# Set up.
q = Bar.query()
q_forward = q.order(Bar.foo)
q_reverse = q.order(-Bar.foo)
# Fetch the first page.
bars1, cursor1, more1 = q_forward.fetch_page(2)
pprint.pprint(bars1)
# Fetch the next (2nd) page.
bars2, cursor2, more2 = q_forward.fetch_page(2, start_cursor=cursor1)
pprint.pprint(bars2)
# Fetch the previous page.
rev_cursor2 = cursor2.reversed()
bars3, cursor3, more3 = q_reverse.fetch_page(2, start_cursor=rev_cursor2)
pprint.pprint(bars3)
(FYI,您可以在本地应用程序引擎的交互式控制台中运行上述代码。)
以上代码打印以下结果;请注意,结果的第三页只是第二页的反转,而不是返回到第一页:
[Bar(key=Key('Bar', 4996180836614144), foo=u'a'),
Bar(key=Key('Bar', 6122080743456768), foo=u'b')]
[Bar(key=Key('Bar', 5559130790035456), foo=u'c'),
Bar(key=Key('Bar', 6685030696878080), foo=u'd')]
[Bar(key=Key('Bar', 6685030696878080), foo=u'd'),
Bar(key=Key('Bar', 5559130790035456), foo=u'c')]
我期望看到这样的结果:
[Bar(key=Key('Bar', 4996180836614144), foo=u'a'),
Bar(key=Key('Bar', 6122080743456768), foo=u'b')]
[Bar(key=Key('Bar', 5559130790035456), foo=u'c'),
Bar(key=Key('Bar', 6685030696878080), foo=u'd')]
[Bar(key=Key('Bar', 6685030696878080), foo=u'a'),
Bar(key=Key('Bar', 5559130790035456), foo=u'b')]
如果我将代码中“获取上一页”部分更改为以下代码片段,则会得到预期的输出,但是使用正向排序的查询和end_cursor而不是文档中描述的机制是否存在我未预见到的缺点?
# Fetch the previous page.
bars3, cursor3, more3 = q_forward.fetch_page(2, end_cursor=cursor1)
pprint.pprint(bars3)