2014-09-25 2 views
0

У меня есть проект appengine, написанный на Python. Я использую модель с tags = ndb.StringProperty(repeated=True).Appengine - запрос ndb с неизвестным размером списка

Что я хочу, учитывая список тегов, ищите все объекты, у которых есть все теги в списке. Моя проблема заключается в том, что список может содержать любое количество тегов.

Что мне делать?

ответ

2

Когда вы делаете запрос на свойство списка, он фактически создает набор подзапросов на уровне хранилища данных. Максимальное количество подзапросов, которые могут быть порождены одним запросом, равно 30. Таким образом, если ваш список содержит более 30 элементов, вы получите исключение.

Чтобы решить эту проблему, вам придется изменить модель базы данных или создать несколько запросов на основе количества элементов списка, которые у вас есть, а затем объединить результаты. Оба эти подходы должны обрабатываться вашим кодом.

Обновление: Если вам нужны все теги в списке, чтобы соответствовать свойству списка в вашей модели, вы можете создать свой основной запрос, а затем добавить операторы AND в цикле (как описывает маркадиан). Например:

qry = YourModel.query() 
qry = qry.filter(YourModel.tags == tag[i]) for enumerate(tags) 

Но, как я уже говорил ранее, вы должны быть осторожны длины свойства списка в вашей модели и конфигурации индексов для того, чтобы избежать таких проблем, как индекс взрыва. Для получения дополнительной информации об этом, вы можете проверить:

+0

Спасибо, это добавить еще, что я не знаю. Но вопрос другой. Как я могу увидеть здесь https://cloud.google.com/appengine/docs/python/ndb/queries, у меня могут быть все объекты, имеющие хотя бы тег в списке. Но я хочу, чтобы объекты содержали ВСЕ теги в списке. И я не могу первый пример со списком [0], list [1] ... list [n], потому что я не знаю n ... – andrew

+0

Я думаю, вы можете добавить И фильтровать что-то вроде .filter (Model. теги == tag [i]) для i в перечислении (теги) – marcadian

+0

Я довольно новичок в Python, и я не понимаю код, написанный таким образом (и это дает мне синтаксическую ошибку для 'for'), я по-прежнему ищут документацию об этом, но он работает, если я использую фильтр и «нормальный» для этого, спасибо большое :) – andrew

Смежные вопросы