gpt4 book ai didi

python - 如何比较 NDB 查询中的多个日期?

转载 作者:太空宇宙 更新时间:2023-11-03 15:56:13 25 4
gpt4 key购买 nike

我需要获取 NDB queries 上的对象匹配给定的开始和结束日期,但我无法执行这个传统上简单的查询,因为 NDB 提示:

from google.appengine.ext import ndb
from datetime import datetime
from server.page.models import Post

now = datetime.now()
query = Post.query(
Post.status == Post.STATUS_ACTIVE,
Post.date_published_start <= now,
Post.date_published_end >= now,
)
count = query.count()

错误:

BadRequestError: Only one inequality filter per query is supported.
Encountered both date_published_start and date_published_end

有没有解决办法?

最佳答案

由于每个查询的单个不等式过滤器的限制,动态获取可直接用于分页而无需任何进一步处理的单个结果列表是不可能的。相关GAE 4301 issue .

正如杰夫提到的,通过一个不等式(最好是最严格的不等式)进行过滤,然后对结果进行进一步的动态处理始终是一种选择,正如您所指出的,效率低下,但如果您需要搜索的完全灵 active ,则不可避免。

您可以通过使用 projection query 来提高性能- 减少从数据存储传输到相关属性的数据量。

您也可以尝试执行2 keys-only queries ,每个不等式一个,然后计算结果的交集 - 这可以更快地为您提供分页计数和实体列表(作为键)。最后,您可以通过直接对页面列表中的键进行键查找来获取当前页面的实体,最好是批量处理(使用 ndb.get_multi())。

根据预期用途,在某些情况下您可能有其他选择(当然需要额外的工作)。

您可以限制查询的范围。在某些情况下,不必查询自时间开始以来的所有 Post 实体,可能只需要特定年份或月份的结果就足够了。然后,您可以添加 year 和/或 month Post 属性,您可以将其作为相等过滤器包含在查询中,从而可能减少结果数量动态处理从数千到数百或更少的数据。

您还可以完全避免对典型、常用案例的查询。例如,如果预期用途是生成几种月度报告,您可以拥有一些 Report 实体,其中包含每个此类报告类型/月份的 Post 键列表每当 Post 实体的相关属性发生更改时进行更新。您不必查询 Posts 实体中的报告,而是只需使用相应 Report 实体中已有的可用列表。您还可以在生成时存储/缓存实际报告,以便直接重用(而不是在每次访问时重新生成)。

关于python - 如何比较 NDB 查询中的多个日期?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40747579/

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