我有这个代码来查找属性分支为空的所有节点。
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)
答案 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。