App Engine 数据存储分页 - 上一页
App Engine datastore paging - previous page
我正在尝试创建一种分页机制来对查询进行分页。前进不是问题。不过,转到上一页似乎很重要。
我目前的情况是这样的(为什么我感觉应该更简单?):
cursor_urlsafe = self.request.get('cursor', None)
rev = bool(self.request.get('rev', None))
cursor = ndb.Cursor(urlsafe=cursor_urlsafe)
if rev:
next_query = Shot.query(Shot.schedule_key == schedule.key).order(Shot.date_created)
cursor = cursor.reversed()
else:
next_query = Shot.query(Shot.schedule_key == schedule.key).order(-Shot.date_created)
shots, next_cursor, more = next_query.fetch_page(PAGE_LENGTH, start_cursor=cursor)
if rev:
shots.sort(key=lambda x: -x.date_created_epoch)
next_cursor_url_safe = next_cursor.urlsafe() if next_cursor else None
template_params = {
'shots': shots,
'next_cursor': next_cursor_url_safe,
'prev_cursor': next_cursor_url_safe if cursor_urlsafe else None
}
在客户端:
<a href="/schedule/{{ s.id }}?cursor={{ prev_cursor }}&rev=true">Previous</a><br>
<a href="/schedule/{{ s.id }}?cursor={{ next_cursor }}">Next</a>
这种作品。唯一的问题是,当用户 "changes direction"(返回页面)时,它会将他带到他所在的页面,并且只有在再次单击上一页后才会转到上一页。
因此,如果单击“上一个”和“下一个”,我将一直停留在同一页面上。
请指教
您可以采用一些策略。存储以前的游标 - 请参阅 https://p.ota.to/blog/2013/4/pagination-with-cursors-in-the-app-engine-datastore/ or alternately search SO for another approach What is the correct way to get the previous page of results given an NDB cursor?
一个解决方案是让客户端在游标前进时保留一个游标列表。当他们向后翻页时,使用列表中的上一个光标。后端的游标可以导出为字符串。在 Java 中,您使用 toUrlSafe 方法。 Python.
可能有等价物
使用上一个游标时,我建议删除列表中的最后一个游标,以便在用户再次向前翻页时创建它的新实例。话又说回来,这取决于数据更改的频率。如果数据很少变化,您可以跳过从列表中删除游标,而只使用缓存的游标来加快后端时间。
我正在尝试创建一种分页机制来对查询进行分页。前进不是问题。不过,转到上一页似乎很重要。
我目前的情况是这样的(为什么我感觉应该更简单?):
cursor_urlsafe = self.request.get('cursor', None)
rev = bool(self.request.get('rev', None))
cursor = ndb.Cursor(urlsafe=cursor_urlsafe)
if rev:
next_query = Shot.query(Shot.schedule_key == schedule.key).order(Shot.date_created)
cursor = cursor.reversed()
else:
next_query = Shot.query(Shot.schedule_key == schedule.key).order(-Shot.date_created)
shots, next_cursor, more = next_query.fetch_page(PAGE_LENGTH, start_cursor=cursor)
if rev:
shots.sort(key=lambda x: -x.date_created_epoch)
next_cursor_url_safe = next_cursor.urlsafe() if next_cursor else None
template_params = {
'shots': shots,
'next_cursor': next_cursor_url_safe,
'prev_cursor': next_cursor_url_safe if cursor_urlsafe else None
}
在客户端:
<a href="/schedule/{{ s.id }}?cursor={{ prev_cursor }}&rev=true">Previous</a><br>
<a href="/schedule/{{ s.id }}?cursor={{ next_cursor }}">Next</a>
这种作品。唯一的问题是,当用户 "changes direction"(返回页面)时,它会将他带到他所在的页面,并且只有在再次单击上一页后才会转到上一页。
因此,如果单击“上一个”和“下一个”,我将一直停留在同一页面上。
请指教
您可以采用一些策略。存储以前的游标 - 请参阅 https://p.ota.to/blog/2013/4/pagination-with-cursors-in-the-app-engine-datastore/ or alternately search SO for another approach What is the correct way to get the previous page of results given an NDB cursor?
一个解决方案是让客户端在游标前进时保留一个游标列表。当他们向后翻页时,使用列表中的上一个光标。后端的游标可以导出为字符串。在 Java 中,您使用 toUrlSafe 方法。 Python.
可能有等价物使用上一个游标时,我建议删除列表中的最后一个游标,以便在用户再次向前翻页时创建它的新实例。话又说回来,这取决于数据更改的频率。如果数据很少变化,您可以跳过从列表中删除游标,而只使用缓存的游标来加快后端时间。