2016-09-06 4 views
1

すばやくこれを行う方法があるかどうかわかりませんが、5つのパラメータから6つのパラメータに基づいて検索します「入力」を選択し、もう1つを「入力」テキストから選択すると、より多くのオプションが選択されたときに検索がより具体化する必要があります。パラメータがDjangoに存在する場合にのみクエリーセットで(&)を使用

ルックアップでこれを行う方法はありますか?または、パラメータの組み合わせごとにifを作成する必要がありますか? ifのすべてを書かなければならない場合、より効率的な方法は何ですか?すべての組み合わせをカバーするために2^6ifの文を実行しなければならない場合、それは少し遅くなります。パラメータには特定の順序がないので、任意の組み合わせが可能であると考えてください。

私はQ objectsで考えていましたが、それが機能するかどうかわかりませんが、ORサテライト用にしか使用していませんでしたが、andステートメントにも使用できることがわかりましたが、 commaを使用する場合とは異なります。おそらくこのような何か:

result = Product.objects.filter(Q(field1=param1)&Q(field2=param2)&Q(field3=param3)&Q(field4=param4)&Q(field5=param5)&Q(field6=param6)) 

答えて

1

あなたがQ&を使用する必要はありません。すべてのフィルター操作は、前にandとなります。したがって、同じ数の操作がパラメータとしてifになります。

q = Product.objects.all() 
if param1 != None: 
    q = q.filter(field1=param1) 
if param2 != None: 
    q = q.filter(field2=param2) 
#and so on 

これはコードと同じですが、ifです。

+0

私はそれが分かりませんでした、それは、ありがとうございました。 – elG

2

フォームのcleaned_dataにアクセスしている可能性があります。「高度な検索」のようなものを探しているようです。あなただけあなたがして確実にするためのフィルタリング文を追加することができ、指定されたフィールドを含めたいので、その場合には、フォームフィールドの全てが検索に関連していることを考えると、あなたは

result = Product.objects.filter(**form.cleaned_data)

ような何かを行うことができますあなたは関連するフィールドだけを見ているだけです。残念ながら、それはあなたのフォームがどのように見えるかに大きく依存します。フォームの非空の値がすべてtruthyであれば他の一方で、あなただけのフィールドは、彼らがして、フォームを埋めたものから変更されているフィルタを適用したい場合は、

result = Product.objects.filter(**{k: v for k, v in form.cleaned_data.items() if v})

ような何かを行うことができますあなたも、あなたがturtle_safeという名前のチェックボックスを持っている場合、誰かが、彼らはのために安全ではないカメや結果のために安全である結果を望んでいることを示していますかどうかを記録する必要があります、残念ながら

result = Product.objects.filter(**{k: v for k, v in form.cleaned_data.items() if form.changed_data})

によって提供される可能性がありますカメ。私が提案したフォローアップのアプローチは、「カメには安全ではない」というフィルタを適用せず、代わりに「カメの安全性を優先しない」フィルタにします(オプションではデフォルトでFalseと仮定します)。

これで十分でない場合は、ユーザーが意図的に選択しなかったフィールドを投稿することを避けることができます。

これで終わる場合は、Noneにデフォルト値を設定し、有効なオプションでない限り、2番目のチェックを使用することができます。

+0

これは本当にいいですが、私はリクエストにAJAXを使っていると言っていることを忘れていました。したがって、フォームではなく「普通の」変数があります。しかし、これは面白そうです、私はフォーム全体を提出する他の検索でそれを試してみるつもりです。 – elG

+0

FYIフォームデータはAJAXデータで正常に動作します。同じビューに送信するだけでフォームが表示されます。あなたはおそらくjsonの応答が欲しいでしょう。 http://stackoverflow.com/a/8244082/3208419 –

+0

これはformData()が存在する理由です。そのため、DJangoは素晴らしいと思っています。プログラミングが自動化されています。 formData()ではデータを送信し、DJangoでは次のように受け取るだけです:myform = theform(request.POST)、通常の送信権と同じですか? – elG

関連する問題