Jaki jest właściwy sposób uzyskania poprzedniej strony wyników z kursorem NDB?

Pracuję nad udostępnieniem interfejsu API za pośrednictwem GAE, który pozwoli użytkownikom na przewijanie stron do przodu i do tyłu przez zestaw elementów. Przejrzałemsekcja o kursorach na stronie dokumentacji zapytań NDB, który zawiera przykładowy kod, który opisuje, jak przewijać do tyłu przez wyniki zapytania, ale wydaje się, że nie działa zgodnie z oczekiwaniami. Używam GAE Development SDK 1.8.8.

Oto zmodyfikowana wersja tego przykładu, która tworzy 5 przykładowych jednostek, pobiera i drukuje pierwszą stronę, przechodzi do następnej strony i drukuje drugą stronę oraz próbuje cofnąć się i wydrukować pierwszą stronę ponownie:

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, możesz uruchomić powyższe w interaktywnej konsoli lokalnego silnika aplikacji).

Powyższy kod drukuje następujące wyniki; zauważ, że trzecia strona wyników jest tylko drugą stroną odwróconą, zamiast powrotu do pierwszej strony:

[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')]

Spodziewałem się zobaczyć takie wyniki:

[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')]

Jeśli zmienię sekcję „Pobierz poprzednią stronę” kodu na poniższy fragment kodu, otrzymam oczekiwane dane wyjściowe, ale czy są jakieś wady, których nie przewidziałem do użycia zapytania i end_cursora uporządkowanego w przód zamiast opisanego mechanizmu w dokumentacji?

# Fetch the previous page.
bars3, cursor3, more3 = q_forward.fetch_page(2, end_cursor=cursor1)
pprint.pprint(bars3)

questionAnswers(2)

yourAnswerToTheQuestion