3

我有这段代码来查找属性分支为空的所有节点。

nobranches=TreeNode.all()

for tree in nobranches:
 if tree.branches==[]:

我想找到一种更好、更有效的方法来做到这一点。我不必检索所有 TreeNodes 的肉类。我已经尝试过 TreeNode.all().filter(branches=[]) 但这给了我一条消息,“BadValueError('不支持对列表进行过滤'”。我该怎么做 TreeNode.gql('WHERE branches= :1', []).fetch(100)。我试过这个,但我得到一个“BadValueError:可能不使用空列表作为属性值;属性是 []”。还有其他有效的方法吗?

顺便说一句,这就是 TreeNode 的样子

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

4

2 回答 2

1

您不能使用过滤器来做到这一点:正如撒克逊所说,没有与您要检索的内容匹配的索引行,因此无法检索它。

一个简单的替代方法是存储另一个包含列表中元素数量的属性,并对其进行过滤。aetycoon是一个包含计算属性的库,可以帮助解决这个问题:

class TreeNode(db.Model):
  name = db.StringProperty()
  branches = db.ListProperty(db.Key)
  branch_count = aetycoon.DerivedProperty(lambda self: len(self.branches))
于 2010-10-13T08:28:21.360 回答
0

关于如何存储索引的文档说:

对于多值属性,例如 ListProperty 和 StringListProperty,每个值都有自己的索引行,因此使用多值属性确实会导致更多的索引开销。

因此,对于列表属性中的每个项目,索引中都有一行。

我的期望是,如果列表属性中没有项目,那么索引中就没有行。所以不可能使用索引来检索具有空列表的实体。

一种解决方案是添加另一个属性(例如hasbranches = db.BooleanProperty()),您可以在添加或删除分支时维护该属性。然后您将能够过滤 hasbranches = False。

于 2010-10-13T06:29:34.343 回答