在googleappengin中按不同字段过滤和排序

2024-10-03 15:33:11 发布

您现在位置:Python中文网/ 问答频道 /正文

以下代码在执行时产生First ordering property must be the same as inequality filter property错误,因为您不能按非筛选器的字段排序。在

q = Score.all()
q.filter("levelname = ", levelname)
q.filter("submitted >", int(time.time()) - (86400*7))
q.order("-score")
scoreList = q.fetch(10)

我需要做的是找出不到一周的前10名得分。可能有10万个(如果不是更多的)分数,所以我不能只把它们全部取出来用python进行排序。在

有办法吗?在


Tags: the代码time排序as错误propertybe
2条回答

正如sologub提到的,预计算是一种可行的方法。在

但是,您可以使用许多等式过滤器,因此,除了保留一个单独的最高分数列表之外,另一种方法是让每个实体都有一个标志(例如,一个布尔值),它表示它是否有资格进入最高分数列表(在您的情况下,不超过一周),并且有一个每日cron作业,该作业检索具有资格标志的所有实体的列表,检查日期,并在需要时更改标志。在

这会占用更多的存储空间(每个实体多出一个字段),但我想一个优点是可以动态地选择要返回多少个最高分。(你也可以有几个这样的标志,比如一个代表历史最高分数,一个只代表上周,等等)

一般来说,每次出现计数问题时,大家一致认为,使用GAE,您应该尽可能地预计算所有内容。我要处理你对前10分的具体要求的方法是,创建一个拥有最高分数的实体,并在新得分超过前10分时更新职位。在

计算分数时,可以查询有多少其他分数大于计算的分数。如果计数超过10,则不需要更新分数。这将是大多数时间。如果计数等于或大于10,则需要更新顺序,以便获得前10名,并根据需要插入新的分数。在

为了处理时间部分,我需要运行一些进程,每天检查一个分数是否应该从前10名中剔除,如果是,则获取下一个最高的来替换它。在

下面是一组关于类似主题的答案,这些主题解决了适用于GAE数据存储的设计模式和逻辑:What's the best way to count results in GQL?

相关问题 更多 >