listProperty中无值的gqlquery
-
29-09-2019 - |
题
我有此代码可以找到属性分支为空的所有节点。
nobranches=TreeNode.all()
for tree in nobranches:
if tree.branches==[]:
我想找到一种更好,更有效的方法来做到这一点。我不必检索所有treenodes的meathod。我已经尝试了treenode.all()。滤波器(branches = []),但这给了我一条消息,“ badvalueError('不支持列表上的过滤'。 :1',[])。提取(100)。我尝试过,但是我得到了一个“ badvalueError:可能不会将空列表用作属性值;属性为[]”。还有其他有效的方法吗?
顺便说一句,这是treenode的样子
class TreeNode(db.Model):
name = db.StringProperty()
branches =db.ListProperty(db.Key)
解决方案
这 有关如何存储索引的文档 说:
对于多值属性,例如ListProperty和StringListProperty,每个值都有其自己的索引行,因此使用多值属性确实会导致更多的索引开销。
因此,对于列表属性中的每个项目,索引中都有一行。
我的期望是,如果列表属性中没有项目,则索引中不会有行。因此,不可能使用索引用空列表检索实体。
一种解决方案是添加另一个属性(例如 hasbranches = db.BooleanProperty()
),当您添加或删除分支时保持。然后,您将能够过滤hasbranches = false。
其他提示
您不能用过滤器来做到这一点:正如撒克逊人所说,没有索引行匹配您要检索的内容,因此无法检索它。
一种简单的选择是存储包含列表中元素数量的另一个属性,然后对其进行过滤。 Aetycoon 是包含可能有助于此属性的计算属性的库:
class TreeNode(db.Model):
name = db.StringProperty()
branches = db.ListProperty(db.Key)
branch_count = aetycoon.DerivedProperty(lambda self: len(self.branches))