3

プロパティブランチが空のすべてのノードを見つけるためのこのコードがあります。

nobranches=TreeNode.all()

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

これを行うためのより良い、より効率的な方法を見つけたかったのです。すべての TreeNode を取得する必要がない方法。TreeNode.all().filter(branches=[]) を試しましたが、「BadValueError('リストのフィルタリングはサポートされていません'」というメッセージが表示されます。 :1', []).fetch(100).これを試してみましたが、「BadValueError: 空のリストをプロパティ値として使用できない可能性があります; プロパティは [] です。」他の効率的な方法はありますか?

ところで、これは TreeNode がどのように見えるかです

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

4

2 に答える 2

1

フィルターを使用してこれを行うことはできません。Saxon が言うように、取得したいものに一致するインデックス行がないため、それを取得する方法がありません。

簡単な代替手段の 1 つは、リスト内の要素の数を含む別のプロパティを格納し、それをフィルター処理することです。aetycoonは、それを支援する計算されたプロパティを含むライブラリです。

class TreeNode(db.Model):
  name = db.StringProperty()
  branches = db.ListProperty(db.Key)
  branch_count = aetycoon.DerivedProperty(lambda self: len(self.branches))
于 2010-10-13T08:28:21.360 に答える
0

インデックスの保存方法に関するドキュメントには、次のように記載されています。

ListProperty や StringListProperty などの多値プロパティの場合、各値には独自のインデックス行があるため、多値プロパティを使用するとインデックス作成のオーバーヘッドが増加します。

そのため、リスト プロパティの各項目に対して、インデックスに行があります。

私の予想では、リスト プロパティにアイテムがない場合、インデックスには行がありません。そのため、インデックスを使用して空のリストを持つエンティティを取得することはできません。

hasbranches = db.BooleanProperty()解決策の 1 つは、ブランチを追加または削除するときに保持する別のプロパティ (例: ) を追加することです。次に、hasbranches = False でフィルタリングできます。

于 2010-10-13T06:29:34.343 に答える