2017-11-17 5 views
0

フォームメソッドを使用するDjangoでフィルタを実行します。 ユーザがde varを入力した場合、データセット内でvarをクエリーする必要があります。空白のままにしておくと、すべての要素が表示されます。空のフィールドがすべての要素を返す場合は、DjangoのQueryset

どうすればいいですか?

私はこれを行うための簡単でより明示的な方法は次のようになりジャンゴ

if request.GET.get('Var'): 
    Var = request.GET.get('Var') 
else: 
    Var = WHAT SHOULD I PUT HERE TO FILTER ALL THE ELEMNTS IN THE CODE BELLOW 

models.objects.filter(Var=Var) 

答えて

1

検索キーワードに直接入力する必要があります(これらのキーワードを使用している場合は、未処理のSQLクエリに対しては特に定義する必要はありません)。

この点を念頭に置いて、より動的なフィルタ

オプション1:辞書構文

def my_view(request): 
    query = {} 
    if request.GET.get('Var'): 
    query['Var'] = request.GET.get('Var') 
    if request.GET.get('OtherVar'): 
    query['OtherVar'] = request.GET.get('OtherVar') 
    if request.GET.get('thirdVar'): 
    # Say you wanted to add in some further processing 
    thirdVar = request.GET.get('thirdVar') 
    if int(thirdVar) > 10: 
     query['thirdVar'] = 10 
    else: 
     query['thirdVar'] = int(thirdVar) 
    if request.GET.get('lessthan'): 
    lessthan = request.GET.get('lessthan') 
    query['fieldname__lte'] = int(lessthan) 
    results = MyModel.objects.filter(**query) 

を何もクエリ辞書に追加されていないと、それが空だ、それができるでしょう場合は、辞書の構文を使用して、またはそれに沿って行くようにクエリセットを改訂作成上記からMyModel.objects.allを行うための同等の()

私のセキュリティ・ノートでは、あなたが(悪い考えだろう)このような何かを試してみたかった場合は適用されます。

MyModel.objects.filter(**request.GET) 

Djangoは優れたセキュリティ記録を持っていますが、これはユーザーが持つクエリの種類を予測するよりも安全性が低くなります。これは、インデックスされていないフィールドに沿って重いクエリを作成するためにクエリ構文を適合させる可能性のある悪意のあるサイトユーザーがスキーマを知っている場合には、大きな問題になる可能性があります。

オプション2: 代わりにクエリセットを改訂では、あなたはすべてのためのクエリセットから始め、その後、私があれば進んでくださいどのようにそれが最初のオプションでは完全に..働い

def my_view(request): 
    results = MyModel.objects.all() 
    if request.GET.get('Var'): 
    results = results.filter(Var=request.GET.get('Var')) 
    if request.GET.get('OtherVar'): 
    results = results.filter(OtherVar=request.GET.get('OtherVar')) 
    return results 
+0

おかげでロバートに応じてフィルタリングすることができます私は変数のうちの1つだけを数値より大きくしたいと思っていますか? –

+0

喜んで助けてください!また、あなたの質問に関しては、条件を使って他の辞書と同じように辞書を変更することでクエリを変更することができます。私は私のサンプルビューでthirdVarの例を作ったが、あなたが構築しようとしているより特定のユースケースがあるかどうか知らせてくれている。 –

+0

はい私はもっと手助けが必要です。私は手の届かないところです。例は次のとおりです。ユーザーはフォームフィールドに数字を入力して送信します。システムは、その番号の付いたすべての要素を照会して返す必要があります。 –

2

に新しいです:入力されたデータにユーザーを許可するようにセキュリティの観点から、素晴らしいアイデアではありません

if request.GET.get('Var'): 
    data = models.objects.filter(Var=request.GET.get('Var')) 
else: 
    data = models.objects.all() 
関連する問題