gpt4 book ai didi

google-app-engine - 谷歌应用引擎中的ndb.OR操作

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

我正在做一个项目,我需要按降序执行 ndb.OR 操作,但是对于下面的代码,我收到这样的错误:

BadRequestError:第一个排序属性必须与应用不等式过滤器的属性相同。在您的查询中,第一个排序属性是 TestNo 但不等式过滤器在 Math 上

class StudentMarks(ndb.Model):
Math = ndb.IntegerProperty()
Science = ndb.IntegerProperty()
English = ndb.IntegerProperty()
Social = ndb.IntegerProperty()
TestNo = ndb.IntegerProperty()

@classmethod
def queryData(cls):
return cls.query(ndb.OR(ndb.OR(cls.Math > 0, cls.Science > 0),
ndb.OR(cls.English > 0 , cls.Social > 0))).order(-cls.TestNo)

有没有其他方法可以实现这个方法。

最佳答案

在不了解您的用例的情况下,我可以想出两种方法。

  1. 事后在内存中排序 - 如果您有数千个实体,这将无法扩展。
  2. 使用 and AND 子句并使用 TestNo 作为第一个不等式过滤器(例如 TestNo > -1)和 OR 作为 AND 子句的第二部分。

另一种方法可能是更改或添加存储的数据,以便您可以使用相等过滤器。您似乎正在寻找值大于 0 的数学、科学、英语等的各种组合。考虑添加一个 ComputedProperty,它存储数学、科学等的 bool 值 true > 0,如果 == 0 则为 false ,那么您可以将查询重写为像下面这样的东西。 (我正在为计算属性使用像 hasMath 这样的属性名称)

计算属性看起来像

hasMath = ndb.ComputedProperty(lambda self: self.Math > 0)    

查询将是

cls.query(ndb.OR(ndb.OR(cls.hasMath == True, cls.hasScience == True),
ndb.OR(cls.hasEnglish == True , cls.hasSocial == True))).order(-cls.TestNo)

进一步查看您的查询,您可以将计算属性减少为单个属性以满足您的查询要求。

 hasClass = ndb.ComputedProperty(lambda self: self.Math > 0 or self.Science > 0 or self.English > 0 or self.Social > 0)

您的查询将是

 cls.query(cls.hasClass == True).order(-cls.TestNo)

假设这是您要执行的唯一此类查询,最后一个选项将是性能最佳且索引成本最低的选项。

关于google-app-engine - 谷歌应用引擎中的ndb.OR操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20112695/

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