gpt4 book ai didi

python - 给定 NDB 游标获取上一页结果的正确方法是什么?

转载 作者:太空狗 更新时间:2023-10-29 17:18:33 28 4
gpt4 key购买 nike

我正致力于通过 GAE 提供一个 API,允许用户通过一组实体向前和向后翻页。我查看了 section about cursors on the NDB Queries documentation page ,其中包含一些示例代码,描述了如何通过查询结果向后翻页,但它似乎没有按预期工作。我正在使用 GAE 开发 SDK 1.8.8。

下面是该示例的修改版本,它创建 5 个示例实体,获取并打印第一页,前进并打印第二页,然后尝试后退并再次打印第一页:

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)

(仅供引用,您可以在本地应用引擎的交互式控制台中运行以上内容。)

以上代码打印出如下结果;请注意,结果的第三页只是倒转第二页,而不是返回到第一页:

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

我期待看到这样的结果:

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

如果我将代码的“获取上一页”部分更改为以下代码片段,我会得到预期的输出,但是使用前向查询和 end_cursor 而不是我没有预见到的任何缺点文档中描述的机制?

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

最佳答案

为了使文档中的示例更清晰一点,让我们暂时忘记数据存储,转而使用列表:

# some_list = [4, 6, 1, 12, 15, 0, 3, 7, 10, 11, 8, 2, 9, 14, 5, 13]

# Set up.
q = Bar.query()

q_forward = q.order(Bar.key)
# This puts the elements of our list into the following order:
# ordered_list = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]

q_reverse = q.order(-Bar.key)
# Now we reversed the order for backwards paging:
# reversed_list = [15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0]

# Fetch a page going forward.

bars, cursor, more = q_forward.fetch_page(10)
# This fetches the first 10 elements from ordered_list(!)
# and yields the following:
# bars = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
# cursor = [... 9, CURSOR-> 10 ...]
# more = True
# Please notice the right-facing cursor.

# Fetch the same page going backward.

rev_cursor = cursor.reversed()
# Now the cursor is facing to the left:
# rev_cursor = [... 9, <-CURSOR 10 ...]

bars1, cursor1, more1 = q_reverse.fetch_page(10, start_cursor=rev_cursor)
# This uses reversed_list(!), starts at rev_cursor and fetches
# the first ten elements to it's left:
# bars1 = [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]

因此文档中的示例以两个不同的顺序从两个不同的方向获取同一页面。这不是您想要实现的。

您似乎已经找到了一个很好地涵盖您的用例的解决方案,但让我建议另一个:

简单的重用cursor1回到page2。
如果我们谈论前端并且当前页面是 page3,这意味着将 cursor3 分配给“下一个”按钮,将 cursor1 分配给“上一个”按钮。

这样您就不必反转查询和游标。

关于python - 给定 NDB 游标获取上一页结果的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21148476/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com