gpt4 book ai didi

python - 如何在 GoogleAppEngine 中查找键不在 StringListProperty 中的对象

转载 作者:行者123 更新时间:2023-11-28 16:51:19 25 4
gpt4 key购买 nike

我很确定以上内容不可能直接实现(但我很乐意错了)。所以这就是我正在尝试做的事情,但我不知道如何让有用的查询起作用。

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 作为 User 对象上的 StringListPropery(indexed=False) 进行缓存,这样可以加快速度,但之后我必须进行修剪删除现在已完成的挑战(我可以在 UI 请求之外执行)。

我希望我遗漏了一些关于如何使用 AppEngine 数据存储执行查询的明显信息。

最佳答案

如您所料,这实际上是不可能的。列表属性中的元素是单独索引的,因此“不等于 x”的过滤器将返回至少有一个值不等于 x 的任何列表,而不是所需的结果。

不过,鉴于您描述的情况,用户似乎不太可能面临无限多的挑战。获取他们已经面临的挑战,并从结果集中过滤掉这些结果,这似乎是一个合理的解决方案。如果你想让事情更有效率,你可以存储针对用户的挑战列表,而不是相反。这也意味着对于可以参与给定挑战的用户数量不再有实际限制。

最后,不要使用 db.StringListProperty 来存储序列化键 - 相反,请使用 db.ListProperty(db.Key)

关于python - 如何在 GoogleAppEngine 中查找键不在 StringListProperty 中的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7054820/

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