gqlquery без значений в ListProperty
-
29-09-2019 - |
Вопрос
У меня есть этот код, чтобы найти все узлы, где свойства ветвей пусты.
nobranches=TreeNode.all()
for tree in nobranches:
if tree.branches==[]:
Я хотел найти лучший, более эффективный способ сделать это. Мефейт, где мне не нужно получать все триноды. Я попробовал TREENODE.ALL (). Фильтр (ветви = []), но это дает мне сообщение, «BadValueError (» фильтрация в списках не поддерживается «». Как я могу сделать что-то вроде TREENODE.GQL («где филиалы = : 1 ', []). Fetch (100). Я попробовал это, но получаю «BadvalueError: не может использовать пустой список как значение свойства; свойство []». Есть ли другой эффективный способ?
Кстати, вот как выглядит тринен
class TreeNode(db.Model):
name = db.StringProperty()
branches =db.ListProperty(db.Key)
Решение
То Документация о том, как хранятся индексы говорит:
Для многоцелевых свойств, таких как ListProperty и StringListProperty, каждое значение имеет свой собственный ряд индекса, поэтому использование многоцелевых свойств приводит к большему количеству индексации наверху.
Поэтому для каждого элемента в своем списке свойство есть строка в индексе.
Мое ожидание было бы то, что если в недвижимости в списке нет элементов, то в индексе нет строк. Поэтому было бы невозможно использовать индекс для извлечения объектов с пустым списком.
Одно решение было бы добавить другое свойство (например, hasbranches = db.BooleanProperty()
), который вы поддерживаете при добавлении или удалении ветвей. Тогда вы сможете фильтровать для hasbranches = false.
Другие советы
Вы не можете сделать это с фильтром: как говорит Saxon, нет никаких индексных строк, совпадающих, что вы хотите получить, и поэтому никак не выбрать его.
Одна простая альтернатива - хранить другое свойство, которое содержит количество элементов в списке, и фильтруйте на этом. местный это библиотека, которая содержит вычисленные свойства, которые могут помочь с этим:
class TreeNode(db.Model):
name = db.StringProperty()
branches = db.ListProperty(db.Key)
branch_count = aetycoon.DerivedProperty(lambda self: len(self.branches))