我正在尝试查询一系列有效日期
q = Licence.query(Licence.valid_from <= today,
Licence.valid_to >= today,
ancestor = customer.key
).fetch(keys_only=True)
我知道Datastore不支持两个属性的不等式查询。 所以我这样做:
kl = Licence.query(Licence.valid_from <= today,
ancestor = customer.key
).fetch(keys_only=True)
licences = ndb.get_multi(kl)
for item in licences:
if item.valid_to < today:
licence.remove(item)
但我不喜欢,因为我认为我使用太多的RAM从数据存储中检索更多的实体(或密钥),这是我最终需要的。
任何团体都知道更好的方法来进行此类查询吗?
在.get()之前使用.filter()是否足够?
由于
答案 0 :(得分:1)
一种解决方案是创建一个新字段,例如start_week,它会对查询进行存储并允许您使用IN查询进行过滤:
q = Licence.query(Licence.start_week in range(5,30),
Licence.valid_to >= today,
ancestor = customer.key)
更简单:使用projection query来识别正确的数据集而无需获取完整实体。这比常规查询更快。
it = Licence.query(License.valid_from <= today,
ancestor = customer.key
).iter(projection=[License.valid_to])
keys = [e.key for e in it if e.valid_to >= today]
licenses = ndb.get_multi(keys)