在ListProperty中没有值的gqlquery

时间:2010-10-13 05:06:05

标签: google-app-engine gqlquery

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

nobranches=TreeNode.all()

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

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

BTW,这就是TreeNode的样子

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

2 个答案:

答案 0 :(得分:1)

你不能用过滤器做到这一点:正如Saxon所说,没有索引行匹配你想要检索的内容,因此无法检索它。

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

class TreeNode(db.Model):
  name = db.StringProperty()
  branches = db.ListProperty(db.Key)
  branch_count = aetycoon.DerivedProperty(lambda self: len(self.branches))

答案 1 :(得分:0)

documentation on how indexes are stored说:

  

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

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

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

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