Как я могу отфильтровать по ключу или ключам запрос в Python для Google App Engine? - PullRequest
2 голосов
/ 09 февраля 2011

У меня есть query, и я могу без проблем применить к ним filters.Это прекрасно работает:

query.filter('foo =', 'bar')

Но что, если я хочу отфильтровать свой запрос по key или списку ключей?

У меня они есть как Key() свойство или string, и, пытаясь что-то подобное, это не сработало:

query.filter('key =', 'some_key')        #no success
query.filter('key IN', ['key1', 'key2']) #no success

Ответы [ 4 ]

3 голосов
/ 09 февраля 2011

Хотя есть возможность фильтрации по ключу - см. Ответ @ dplouffe - это не очень хорошая идея. Предложения «IN» выполняют по одному запросу для каждого элемента в предложении, поэтому в итоге вы выполняете столько запросов, сколько имеется ключей, что является особенно неэффективным способом достижения вашей цели.

Вместо этого используйте операцию пакетной выборки в качестве документов @Luke, а затем отфильтруйте все элементы, которые вам не нужны, из списка в вашем коде.

1 голос
/ 09 февраля 2011

Вы можете отфильтровать запросы, выполнив запрос GQL следующим образом:


result = db.GqlQuery('select * from Model where __key__ IN :1', [db.Key.from_path('Model', 'Key1'), db.Key.from_path('Model', 'Key2')]).fetch(2)

или


result = Model.get([db.Key.from_path('Model', 'Key1'), db.Key.from_path('ProModelduct', 'Key2')])
1 голос
/ 09 февраля 2011

Вы не можете фильтровать по ключу. Упс, я был неправ в этом.Вы можете фильтровать по ключу и другим свойствам одновременно, если у вас есть индекс, настроенный для его обработки.Это выглядело бы так:

key = db.Key.from_path('MyModel', 'keyname')
MyModel.all().filter("__key__ =", key).filter('foo = ', 'bar')

Вы также можете искать несколько моделей по их ключам, идентификаторам или именам ключей с помощью семейства методов get.1009 * Таким способом вы можете получить много объектов.Я не знаю точного предела.Если какой-либо из ключей не существует, вы получите None в списке для этой сущности.

Если вам нужно отфильтровать как некоторое свойство, так и ключ, вам придетсясделать это в два этапа.Либо выбирайте по ключам и проверяйте свойство, либо запрашивайте свойство и проверяйте ключи.

Вот пример фильтрации после выборки.Обратите внимание, что вы не используете метод класса Query filter.Вместо этого просто отфильтруйте список.

models = MyModels.get_by_key_name('asdf', ...)

filtered = itertools.ifilter(lambda x: x.foo == 'bar', models)
0 голосов
/ 13 февраля 2014

Посмотрите на: https://developers.google.com/appengine/docs/python/ndb/entities?hl=de#multiple

list_of_entities = ndb.get_multi(list_of_keys)
...