2010-10-13 52 views
3

我有這段代碼來查找屬性分支爲空的所有節點。對於ListProperty中沒有值的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,這裏是樹節點是什麼樣子

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

+0

只是猜測,但是'WHERE branches = None'呢? – sje397 2010-10-13 05:16:38

+0

分支從不是空如果它是空的是一個空列表 – 2010-10-13 05:57:05

回答

0

documentation on how indexes are stored說:

For multi-valued properties, such as ListProperty and StringListProperty, each value has its own index row, so using multi-valued properties does result in more indexing overhead.

因此,對於列表屬性中的每個項目,索引中都有一行。

我的期望是,如果有列表中的屬性沒有項目,那麼就會在索引中沒有行。因此,使用索引來檢索具有空列表的實體是不可能的。

一個解決辦法是增加另一個屬性(例如hasbranches = db.BooleanProperty()),您保持在您添加或刪除分支。然後,您將能夠過濾hasbranches = False。

1

你不能用一個過濾器做到這一點:作爲薩克森說,沒有索引行匹配要檢索什麼,所以沒辦法撿回來。

一個簡單的替代方法是存儲包含列表中元素的數量的另一個屬性,並在該過濾器。 aetycoon是一個庫,其中包含可能有助於此計算的屬性:

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