gqlquery без значений в ListProperty - PullRequest
3 голосов
/ 13 октября 2010

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

nobranches=TreeNode.all() </p> <p>for tree in nobranches:<br> if tree.branches==[]:

Я хотел найти лучший, более эффективный способ сделать это. Мясной путь, где мне не нужно извлекать все TreeNode. Я пробовал TreeNode.all (). Filter (branch = []), но это дает мне сообщение «BadValueError (« Фильтрация по спискам не поддерживается »». Как я могу сделать что-то вроде TreeNode.gql («WHERE branch = : 1 ', []). Fetch (100). Я пробовал это, но я получаю «BadValueError: Возможно, не использовать пустой список в качестве значения свойства; свойство это []". Есть ли другой эффективный способ?

Кстати, вот как выглядит TreeNode

class TreeNode(db.Model):<br> name = db.StringProperty()<br> branches =db.ListProperty(db.Key)<br>

Ответы [ 2 ]

1 голос
/ 13 октября 2010

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

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

class TreeNode(db.Model):
  name = db.StringProperty()
  branches = db.ListProperty(db.Key)
  branch_count = aetycoon.DerivedProperty(lambda self: len(self.branches))
0 голосов
/ 13 октября 2010

Документация о том, как хранятся индексы , гласит:

Для многозначных свойств, таких как ListProperty и StringListProperty, каждое значение имеет свою собственную строку индекса, поэтому при использовании multi-значные свойства приводят к дополнительным затратам на индексирование.

Таким образом, для каждого элемента в вашем свойстве списка есть строка в индексе.

Я ожидаю, что если естьнет элементов в списке свойств, то в индексе не будет строк.Таким образом, было бы невозможно использовать индекс для извлечения сущностей с пустым списком.

Одним из решений будет добавление другого свойства (например, hasbranches = db.BooleanProperty()), которое поддерживается при добавлении или удалении ветвей.Тогда вы сможете фильтровать по hasbranches = False.

...