ユーザーの要求に基づいて、可能な基準の範囲(0〜4)でデータストアにクエリを実行したいと思います。NDBのクエリは次のように作成されます。
query = Account.query(Account.userid >= 40, Account.userid < 50)
次のようなことができる方法はありますか?
myfilter = []
myfilter.push('Account.userid >= 40')
myfilter.push('Account.userid < 50')
myfilter.push('Account.name == "John"')
query = Account.query(*myfilter)
条件に応じて、0から4のフィルター引数があります。私の仮定(間違っている可能性があります)は、必要がない場合は、キャッチオール(例:Account.userid == *)を使用するよりもフィルターを省略する方が最適であるということです。
フィルタをチェーンできることは知っていますが、クエリオブジェクトは不変であるため、これが役立つかどうかはわかりません。
はい、可能です。プロパティ値によってフィルタリング:
単一の式でクエリフィルター全体を指定する代わりに、次の手順で作成する方が便利な場合があります。例:
query1 = Account.query() # Retrieve all Account entitites query2 = query1.filter(Account.userid >= 40) # Filter on userid >= 40 query3 = query2.filter(Account.userid < 50) # Filter on userid < 50 too
query3
query
前の例の変数と同等です。クエリオブジェクトは不変であるため、の構築はquery2
影響を与えquery1
ず、の構築はまたはにquery3
影響を与えないことに注意してください。query1
query2
このようなインクリメンタルクエリビルド手法を使用して、必要に応じて条件付きでフィルターを追加できます。例(これは、オプションの条件間の全体的なANDを想定しています):
query = Account.query() # Retrieve all Account entitites
loggin.error(query)
if filter_by_userid:
query = query.filter(Account.userid >= 40, Account.userid < 50)
loggin.error(query)
if filter_by_username:
query = query.filter(Account.name == "John")
loggin.error(query)
loggin.error('Final: %s' % query)
上記のスニペットは、クエリオブジェクトの可換性を具体的に利用しており、query
変数への各割り当ては、それぞれのフィルタを適用することによって取得された新しいクエリオブジェクトを実際に格納します。関連するログメッセージによって確認されます。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加