1

我试图根据 google appengine 文档的示例进行向后分页

NDB 查询游标

我的问题集中在这个例子上:

# Set up.
q = Bar.query()
q_forward = q.order(Bar.key)
q_reverse = q.order(-Bar.key)

# Fetch a page going forward.
bars, cursor, more = q_forward.fetch_page(10)

# Fetch the same page going backward.
rev_cursor = cursor.reversed()
bars1, cursor1, more1 = q_reverse.fetch_page(10, start_cursor=rev_cursor)

基于这个例子,我创建了我自己的版本(像这样):

def get(self):
        #testing = Testing(t="a");
        #testing.put();
        #testing2 = Testing(t="b");
        #testing2.put();
        #testing3 = Testing(t="c");
        #testing3.put();
        #testing4 = Testing(t="d");
        #testing4.put();
        #testing5 = Testing(t="e");
        #testing5.put();

        cursor = ndb.Cursor.from_websafe_string(self.request.get("c"))

        if cursor:
                q = Testing.query()
                q_forward = q.order(Testing.key)
                q_reverse = q.order(-Testing.key)

                bars, next_cursor, more = q_forward.fetch_page(2, start_cursor=cursor)
                rev_cursor = cursor.reversed()
                bars1, prev_cursor, more1 = q_reverse.fetch_page(2, start_cursor=rev_cursor)

                self.response.write("<a href=\"?c="+prev_cursor.to_websafe_string()+"\">&laquo</a><br />")
        else:
                q = Testing.query()
                q_forward = q.order(Testing.key)
                q_reverse = q.order(-Testing.key)

                bars, next_cursor, more = q_forward.fetch_page(2)

        self.response.write('Hello world!<br />')

        for bar in bars:
                self.response.write(bar.t + "<br />")


        self.response.write("<a href=\"?c="+next_cursor.to_websafe_string()+"\">&raquo</a>")

但我仍然不明白为什么,它不能完美地返回上一页......当我单击将第 1 页转发到第 2 页时:

第 1 页:a、b 第 2 页:c、d

但是当我向后点击时:

第 2 页:c、d 第 1 页:b、c(应为:a、b)

这让我很困惑,因为论坛上的某个人可以根据这个例子使它工作,没有人给出他们的示例代码......

4

1 回答 1

2

问题是您正在使用c来引用向后和向前光标。

因此,当您得到一个已经反转的向后光标时,您正在调用

rev_cursor = cursor.reversed()

bars1, prev_cursor, more1 = q_reverse.fetch_page(2, start_cursor=rev_cursor)

因此在开始查询之前光标开始指向另一个方向。

要对此进行更简单的测试,请定义相同的模型并预填充一些数据:

from google.appengine.ext import ndb
class Testing(ndb.Model):
  t = ndb.StringProperty()
ndb.put_multi([Testing(t='a'), Testing(t='b'), Testing(t='c')])

通过查询前两个元素获取游标:

>>> q_forward = Testing.query().order(Testing.t)
>>> result, forward_cursor, _ = q_forward.fetch_page(2)
>>> print [value.t for value in result]
[u'a', u'b']

在反向查询中使用该游标而不反转它

>>> reverse_cursor = forward_cursor.reversed()
>>> result, _, _ = q_reverse.fetch_page(2, start_cursor=reverse_cursor)
>>> print [value.t for value in result]
[u'b', u'a']

与这样做后的反向查询相比:

于 2013-01-27T01:53:33.750 回答