Я работаю над предоставлением API через GAE, который позволит пользователям переходить вперед и назад через набор объектов. Я просмотрел раздел о курсорах на странице документации по документам 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)