listpropertyの値なしのgqlquery
-
29-09-2019 - |
質問
プロパティブランチが空であるすべてのノードを見つけるこのコードがあります。
nobranches=TreeNode.all()
for tree in nobranches:
if tree.branches==[]:
これを行うためのより良い、より効率的な方法を見つけたかったのです。すべてのトレンドデを取得する必要がないミートド。 treeNode.all()。フィルター(branches = [])を試しましたが、これは「badvalueerror( 'リストのフィルタリングはサポートされていない」」というメッセージを提供します。 :1 '、[])。fetch(100)。これを試しましたが、「badvalueerror:空のリストをプロパティ値として使用することはできません。プロパティは[]」を取得します。他に効率的な方法はありますか?
ところで、TreeNodeがどのように見えるかがここにあります
class TreeNode(db.Model):
name = db.StringProperty()
branches =db.ListProperty(db.Key)
解決
ListPropertyやStringListPropertyなどの多値のプロパティの場合、各値には独自のインデックス行があるため、多値のプロパティを使用すると、オーバーヘッドが増えます。
したがって、リストプロパティの各アイテムには、インデックスに行があります。
私の期待は、リストプロパティにアイテムがなければ、インデックスに行がないことになるでしょう。したがって、インデックスを使用して空のリストでエンティティを取得することはできません。
1つの解決策は別のプロパティを追加することです(例: hasbranches = db.BooleanProperty()
)、ブランチを追加または削除するときに維持します。その後、hasbranches = falseをフィルタリングできます。
他のヒント
フィルターでこれを行うことはできません。サクソンが言うように、取得したいものと一致するインデックス行はありません。
簡単な代替品の1つは、リスト内の要素の数を含む別のプロパティを保存し、それをフィルタリングすることです。 エティクーン それに役立つ計算されたプロパティを含むライブラリです。
class TreeNode(db.Model):
name = db.StringProperty()
branches = db.ListProperty(db.Key)
branch_count = aetycoon.DerivedProperty(lambda self: len(self.branches))