我有此代码可以找到属性分支为空的所有节点。

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))
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top