Фильтрация запросов в хранилище данных в списке - PullRequest
4 голосов
/ 10 марта 2010

Выбрать все записи, ID которых нет в списке

Как сделать как:

query = Story.all()

query.filter('ID **NOT IN** =', [100,200,..,..])

Ответы [ 3 ]

3 голосов
/ 10 марта 2010

Нет способа сделать это эффективно в App Engine. Вы должны просто выбрать все без этого фильтра и отфильтровать все соответствующие объекты в вашем коде.

2 голосов
/ 24 июля 2011

Это теперь поддерживается с помощью GQL-запроса

Операторы «IN» и «! =» Во время выполнения Python на самом деле реализованы в SDK и переведены на несколько запросов "под капот».

Например, запрос «ВЫБЕРИТЕ * ОТ ЛЮДЕЙ, ГДЕ ИМЯ В» («Боб», «Джейн») переводится на два запроса, что эквивалентно "ВЫБРАТЬ * ИЗ ЛЮДЕЙ, ГДЕ name = 'Bob'" и "ВЫБРАТЬ * ИЗ ЛЮДЕЙ" ГДЕ имя = 'Джейн' "и слияние результатов. Объединение нескольких дизъюнкция умножает количество необходимых запросов, поэтому запрос "ВЫБРАТЬ * ИЗ ЛЮДЕЙ, ГДЕ ИМЯ (Боб", "Джейн") И возраст! = 25 " генерирует всего четыре запроса для каждого из возможных условий (возраст менее 25 лет и имя «Боб» или «Джейн»), затем объединяет их в один набор результатов.

источник: блог appengine

0 голосов
/ 05 апреля 2018

Это старый вопрос, поэтому я не уверен, является ли ID неключевым свойством. Но чтобы ответить на это:

query = Story.all()
query.filter('ID **NOT IN** =', [100,200,..,..])

... С ndb моделями вы можете определенно запрашивать элементы, которые находятся в списке. Например, см. Документы здесь для IN и !=. Вот как выполнить фильтрацию по запросу OP:

query = Story.filter(Story.id.IN([100,200,..,..])

Мы можем даже запросить элементы, которые находятся в списке повторяющихся ключей:

def all(user_id):
    # See if my user_id is associated with any Group.
    groups_belonged_to = Group.query().filter(user_id == Group.members)
    print [group.to_dict() for group in belong_to]

Некоторые оговорки:

Есть документы, в которых упоминается, что для выполнения этих типов запросов Datastore выполняет несколько запросов за кулисами, что (1) может занять некоторое время, (2) займет больше времени, если вы выполняете поиск в повторяющихся свойствах, и (3) увеличит ваши расходы за счет дополнительных операций.

...