我有一个包含303个Game()实体的GAE数据存储区。
class Game(db.Model):
title = db.StringProperty(required = True)
slug = db.StringProperty(required = True)
category = db.CategoryProperty()
description = db.TextProperty(required = True)
created = db.DateTimeProperty(auto_now_add = True)
'slug'属性与标题类似,只是它用连字符替换所有空格并删除所有特殊字符。例如:('第一场比赛!'成为'第一场比赛')
在网站上,我使用Bootstrap折叠式手风琴列出了所有303款游戏。它工作正常,但因为有太多的游戏,我试图设置一个侧面导航,列出字母表的字母。用户将单击其中一个字母以跳转到列表的特定位置。例如:(用户点击'N',页面跳转到以'N'开头的游戏。)
我知道这很有效,因为如果我将'slug'硬编码到HTML中,它将正确地跳转到所需的位置。但是,'slug'需要在正确的'slug'之前成为一个,否则它将无法正确跳跃。例如:(用户点击'N',HTML中的slug需要'my-last-m-game'才能跳到正确的位置,并在页面顶部显示'N'个游戏。)
我的问题(对于长篇大论的解释感到抱歉)是,是否可以进行GQL查询以获得字母表中每个字母的最后一个游戏?或者将所有游戏放入列表/字典并以这种方式获得正确的“slug”会更好吗?或者我应该为数据本身添加一个属性,这允许我只为'A'游戏或仅为'T'游戏进行GQL搜索,以获得正确的'slug'。或者是否有我可以在Bootstrap中使用的偏移量,这将允许我获得第一个'N'游戏'slug'并使用它来跳转到页面上的正确位置?
感谢您提供的任何帮助。这是我第一次发布到stackoverflow,如果我没有正确地做到这一点,请道歉。
答案 0 :(得分:0)
您可以在字符串上使用前缀匹配。 u“\ ufffd”是最高可能的unicode字符,因此按名称查询< u“b”+ u“\ ufffd”并按名称排序应该对以“b”开头的元素起作用。请注意,此类过滤/排序区分大小写,因此您可能需要以小写形式存储其他字段。
答案 1 :(得分:0)
另一个选择是在Game上有一个名为lastGameForLetter的字段,对于大多数游戏,该字段设置为null)。当您插入游戏时,需要额外检查以确保不需要更新,但使查询更容易。对于那些很少写但经常阅读的内容,我们会一直这样做。