5

我正在尝试为我的应用程序上的查询进行正向和反向分页。

我从以下示例开始:https ://developers.google.com/appengine/docs/python/ndb/queries#cursors

我希望该示例执行典型的向前/向后分页以创建可以传递给模板的光标,以便在当前页面之后/之前的后续请求中使用。但它正在做的是为同一页面获取游标,一个从头开始,另一个从结尾(如果我理解正确的话)。

我想要的是指向下一页开头的光标,以及指向上一页开头的光标,以便在我的 UI 中使用。

根据上面提到的例子,我已经设法用下面的代码几乎做到了:

    curs = Cursor(urlsafe=self.request.get('cur'))

    q = MyModel.query(MyModel.usett == usett_key)
    q_forward = q.order(-MyModel.sugerida)
    q_reverse = q.order(MyModel.sugerida)

    ofus, next_curs, more = q_forward.fetch_page(num_items_page,
                                                 start_cursor=curs)

    rev_cursor = curs.reversed()
    ofus1, prev_curs, more1 = q_reverse.fetch_page(num_items_page,
                                                 start_cursor=rev_cursor)

    context = {}

    if more and next_curs:
        context['next_curs'] = next_curs.urlsafe()

    if more1 and prev_curs:
        context['prev_curs'] = prev_curs.reversed().urlsafe()

问题,以及这个问题的重点,是我使用moreandmore1来查看是否有下一页。这在倒退的意义上是行不通的。对于第一页,more1True,在第二页more1False,随后的页面给出True

我需要False为第一页和True其他每一页提供的东西。看起来这个more返回值是要使用的东西,但也许我有一个错误的查询设置,或者任何其他错误。

感谢大家!

编辑:由于我没有找到一个简单的解决方案,我转而使用ndbpager

4

2 回答 2

2

没有这样的事情。如果您使用游标开始查询(第一页通常没有游标),您知道当前页面之前有(至少)一页。访问前一页的一个常见技巧是反转排序顺序。

如果您有一个按creationdate desc 排序的列表,您可以获取当前页面第一个元素的creationdate,使用倒排顺序查询creationdate < this creationdate 的元素。这将返回比给定创建日期更新的最旧元素。翻转检索到的元素列表(以再次将它们恢复到正确的顺序),您就可以在不使用光标的情况下获得之前页面的元素。

注意:这需要您的排序顺序的值不同。

在某些情况下,也可以使用允许随机访问不同页面的预构建索引,请参阅https://bitbucket.org/viur/server/src/98de79b91778bb9b16e520acb28e257b21091790/indexes.py了解更多信息。

于 2012-12-20T09:52:47.970 回答
-1

我有一个解决方法,而不是最好的解决方案。它正在重定向回上一页。

<a href="javascript:history.back()">Previous</a>

我认为 PagedQuery 有能力,但仍在等待有人发布更全面的教程。

于 2014-08-21T19:59:47.867 回答