Вопрос

У меня есть этот код, чтобы найти все узлы, где свойства ветвей пусты.

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))
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top