Я использую фреймворк GAE python (webapp2) для проекта и у меня есть вопрос, связанный с запросом ndb. Позвольте мне привести пример, чтобы объяснить это ясно:
Вот модель ndb, которая у меня есть:
class Example(ndb.Model):
userid = ndb.StringProperty()
field1 = ndb.StringProperty()
field2 = ndb.StringProperty()
Вот объекты, которые я создал, используя приведенную выше модель:
[Example(key=Key('Example', '1~A~B'), field1=u'B', field2=u'A', userid=u'1'),
Example(key=Key('Example', '1~C~D'), field1=u'D', field2=u'C', userid=u'1'),
Example(key=Key('Example', '2~A~B'), field1=u'B', field2=u'A', userid=u'2'),
Example(key=Key('Example', '2~C~D'), field1=u'D', field2=u'C', userid=u'2'),
Example(key=Key('Example', '3~A~B'), field1=u'B', field2=u'A', userid=u'3'),
Example(key=Key('Example', '3~X~Y'), field1=u'Y', field2=u'X', userid=u'3'),
Example(key=Key('Example', '4~C~D'), field1=u'D', field2=u'C', userid=u'4'),
Example(key=Key('Example', '4~E~F'), field1=u'F', field2=u'E', userid=u'4'),
Example(key=Key('Example', '5~A~B'), field1=u'B', field2=u'A', userid=u'5'),
Example(key=Key('Example', '5~X~Y'), field1=u'Y', field2=u'X', userid=u'5')
]
Учитывая приведенные выше данные, я хочу найти следующее: - Найти все идентификаторы пользователей, для которых выполнены оба следующих условия:
field1='B', field2='A'
and field1='D', field2='C'
В приведенном выше примере следующие идентификаторы пользователей будут соответствовать этому критерию:
userid='1'
userid='2'
Итак, у меня есть вопрос: можем ли мы найти вышеуказанный результат с помощью одного запроса ndb? Если да, то как?
Метод, который я знаю прямо сейчас, может быть достигнут только с помощью запроса OR ndb, где мы находим все записи, соответствующие
Example.query(ndb.OR(ndb.AND(field1='B' AND field2='a'), ndb.AND(field1='D' AND field2='C')))
Затем выполните итерацию по результатам (в python), а затем получите логику для извлечения только тех идентификаторов пользователей, которые имеют field1 = «B», field2 = «A» и field1 = «D», field2 = «C».
Это не кажется эффективным способом по следующей причине: - Мы без необходимости извлекаем больше записей, чем необходимо, с комбинацией ИЛИ. - Если мы ограничим результаты с помощью fetch_page, невозможно узнать, сколько записей будет отфильтровано с использованием наших критериев. Это может даже привести к пустым записям в зависимости от нашего лимита.
ИЛИ, если у меня есть способ сначала найти все идентификаторы пользователей с полем1 = «B» и полем2 = «A», а затем напрямую запросить в этом результате, чтобы найти все идентификаторы пользователя с полем1 = «D» и поле2 = «C», которые будут также решить проблему. Итак, это запрос по результату запроса.
Оцените ваши входы/предложения. Спасибо.