Не понимая вашего варианта использования, я могу придумать два способа.
- Сортировка в памяти постфактум — это не будет масштабироваться, если у вас тысячи сущностей.
- Используйте предложение AND и с TestNo в качестве первого фильтра неравенства (например,
TestNo > -1
) и OR во второй части предложения AND.
Другим подходом может быть изменение или добавление к сохраненным данным, чтобы вы могли использовать фильтры равенства. Кажется, вы ищете различные комбинации математики, естественных наук, английского языка и т. д., которые имеют значение больше 0. Рассмотрите возможность добавления ComputedProperty, в котором хранится логическое значение true для математики, естественных наук и т. д. > 0, и false, если == 0 , то вы можете переписать свой запрос примерно так: (Я использую имя свойства, например 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)
Если предположить, что это единственный запрос такого рода, который вы хотите выполнить, последний вариант будет наиболее производительным и наименее затратным с точки зрения индексов.
person
Tim Hoffman
schedule
21.11.2013