【发布时间】:2011-08-14 03:32:15
【问题描述】:
我很确定上述内容不可能直接实现(但我很乐意犯错)。所以这就是我想要做的,但我不知道如何让有用的查询工作。
class Challenge(db.Model):
name = db.StringProperty()
players = db.StringListProperty(default=[])
created_on = db.DateTimeProperty(auto_now_add=True)
completed_on = db.DateTimeProperty(default=None)
可能有数以千计的挑战。您可以随时加入任意数量的个挑战(在“完成”之前,但你只能参加任何一次挑战。
编辑------------------
挑战是异步完成的(它们可能会持续数天),并在该阶段结束时决定“获胜者”,因此人们可能同时面临多个挑战,等待这些挑战结束。基本上,您加入挑战并完成任务,然后等待其他人也这样做,然后在挑战结束时选择获胜者。在等待期间,您可以加入并完成其他挑战。每个挑战的人数限制为 250-500 人(尚未确定上限)
------------------编辑
我想列出您可以参加的所有挑战,按created_on 排序。 players 是str(user.key()) 的列表,供所有参加挑战的人使用。
你可以这样做:
already_in = Challenge.all().filter('players = ', str(self.user.key())).filter('completed_on =', None)
already_in_set = set()
for challenge in already_in.fetch(1000):
already_in_set.add(str(challenge.key())) # Could cache this in the user object
challenges = Challenge.all().order('created_on')
keepers = []
for challenge in challenges:
if str(challenge.key()) not in already_in_set:
keepers.append(challenge)
if len(keepers) > 11:
break
现在keepers 有你不在的列表。但是上面的代码感觉不是很优化。
当然还有另一种方法可以做到这一点。 (我也不反对重组数据库以使其更好地工作)
我可以将 already_in_set 作为 StringListPropery(indexed=False) 缓存在 User 对象上,这样可以加快速度,但是我必须修剪它以删除现在已完成的挑战(我可以在UI 请求)。
我希望我遗漏了一些关于如何使用 AppEngine 数据存储进行查询的明显内容。
【问题讨论】:
标签: python google-app-engine google-cloud-datastore