検索キーワードに直接入力する必要があります(これらのキーワードを使用している場合は、未処理の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
おかげでロバートに応じてフィルタリングすることができます私は変数のうちの1つだけを数値より大きくしたいと思っていますか? –
喜んで助けてください!また、あなたの質問に関しては、条件を使って他の辞書と同じように辞書を変更することでクエリを変更することができます。私は私のサンプルビューでthirdVarの例を作ったが、あなたが構築しようとしているより特定のユースケースがあるかどうか知らせてくれている。 –
はい私はもっと手助けが必要です。私は手の届かないところです。例は次のとおりです。ユーザーはフォームフィールドに数字を入力して送信します。システムは、その番号の付いたすべての要素を照会して返す必要があります。 –