2017-09-18 8 views
0

です:Djangoで "any"を効果的にクエリするには?たとえば、クエリが

a = request.GET['country'] 
b = request.GET['name'] 
c = request.GET['title'] 
... 
result = models.Data.objects.filter('country' = a, 'name' = b, 'title' = c, ...) 

これらの1つのB、Cは「どれ」であれば、私は何をすべき?

私はフロントエンドからa = "Any"を受け取った場合、この制限をフィルターで効果的に解放する方法を教えてください。

def _get_filter(name, value): 
    return Q() if value == 'Any' else Q((name, value)) 

&と組み合わせる:あなたは、パラメータからQ objectを構築するための機能を行うことができます

答えて

2

可能であれば

q = (
    _get_filter('country', request.GET['country']) & 
    _get_filter('name', request.GET['name']) & 
    _get_filter('title', request.GET['title']) 
) 

result = models.Data.objects.filter(q) 

を、私はまた、要求のソースを取得したいです(フロントエンド?)空の文字列のように、 "Any"を示すためのより良い値を送信します。

0

1回のクエリですべてを行う必要はありません。クエリーは、すべてが完了するまで実行されません。

あなたは使用することができます。

result = models.Data.objects.all() 

if a != 'any': 
    result = result.filter('country' = a) 
if b != 'any': 
    result = result.filter('name' = b) 
if c != 'any': 
    result = result.filter('title' = c) 
... 

すべてが終了するまで、クエリがデータベースに対して実行されませんので、これは本当に余分なクエリを追加しません。

関連する問題