【问题标题】:Paging with reverse cursors in appengine在 appengine 中使用反向光标进行分页
【发布时间】:2012-12-18 11:13:19
【问题描述】:

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

我从示例开始: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

【问题讨论】:

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


    【解决方案1】:

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

    如果您有一个按creationdate desc 排序的列表,您可以获取当前页面第一个元素的creationdate,使用倒排顺序查询creationdate

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

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

    【讨论】:

    • 有些情况下,第一页是用游标查询的,例如,当你转到第2页并返回到第1页时,你会得到第1页的游标。如果你依赖它,那么你就会在第 1 页上显示有前一页,因为你有一个光标。
    • 您是如何创建一个指向列表第一个元素之前的光标的?我试过了,但我只能在获取至少一个元素后创建一个游标 - 因此得到一个指向 after 这个元素的游标(所以使用这个游标的查询总是会丢失第一个元素)
    • 在对逆序查询运行查询后,我得到了那个光标。实际上,你是对的,我严格来说没有得到指向第一个元素之前的光标,我在反向查询中的第一个元素之后的某个位置得到了一个光标,它对应于正向查询末尾附近的一个元素.因此,如果您认为列表是循环的,那么您会产生一种错觉,即它在第一个元素之前,但事实并非如此。也许,如果我开始查询,为前向查询的第一个元素提供光标,这可能会解决,但我不知道该怎么做。
    • 这个游标在前向查询中有效吗?我没有尝试过,但从我从文档中得到的信息中它不应该。如前所述,我不确定是否可以创建一个指向第一个元素前面的光标。但是,使用反向排序技巧,您可以使用 more 来确定当前页面上的元素之前是否有元素(因此必须至少有一个前一页)
    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-10-09
      • 2012-11-24
      • 2021-06-02
      • 2017-08-04
      • 1970-01-01
      • 2011-02-27
      • 2020-06-28
      • 1970-01-01
      相关资源
      最近更新 更多