在appengine中使用反向游标进行分页

时间:2012-12-18 11:13:19

标签: google-app-engine app-engine-ndb

我正在努力向前和向后分页,以便在我的应用上进行查询。

我开始使用以下示例: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()

问题及此问题的关键在于我使用moremore1来查看是否有下一页。而这在后向意义上并不奏效。对于第一页,more1True,第二页more1False,后续页面为True

我需要为第一页提供False的内容,并为每个其他网页提供True。似乎这个more返回值是要使用的东西,但可能我的查询设置错误,或者其他任何错误。

谢谢大家!

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

2 个答案:

答案 0 :(得分:2)

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

如果您有一个列表,按creationdate desc排序,您可以获取当前页面的第一个元素的creationdate,使用creationdate<来查询元素。这个创建日期使用倒排序。这将返回比给定的创建日期更新的最旧元素。翻转已检索元素的列表(再次将它们按正确的顺序排列),然后您可以使用该页面的元素,而无需使用游标。

注意:这需要您的sortorder的值不同。

在某些情况下,还可以使用预建索引,允许随机访问不同的网页,有关详情,请参阅https://bitbucket.org/viur/server/src/98de79b91778bb9b16e520acb28e257b21091790/indexes.py

答案 1 :(得分:-1)

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

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

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