Es ist keine gute Idee, von einem Standpunkt der Sicherheit aus Benutzern der Eingabe von Daten zu ermöglichen direkt in Suchbegriffe (und sollte definitiv nicht für Raw-SQL-Abfragen getan werden, wenn Sie eines von denen verwenden.)
Mit diesem Hinweis im Hinterkopf, können Sie dynamische Filter nutzen Erstellung mit einem Wörterbuch Syntax oder die queryset arbeiten, wie es entlang geht:
Option 1: Wörterbuch Syntax
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)
Wenn nichts auf die Abfrage Wörterbuch hinzugefügt wurde, und es ist leer, das wird sein die äquivalent zu tun MyModel.objects.all()
Mein Sicherheitshinweis von oben gilt, wenn Sie so etwas wie dies zu tun (was eine schlechte Idee wäre) versuchen wollten:
MyModel.objects.filter(**request.GET)
Django hat eine gute Sicherheitsbilanz, aber das ist weniger sicher als die Art der Abfragen vorauszusehen, die Ihre Benutzer haben werden. Dies kann auch ein großes Problem darstellen, wenn Ihr Schema einem Benutzer einer Website mit schädlicher Wirkung bekannt ist, der die Abfragesyntax anpassen kann, um eine umfangreiche Abfrage in nicht indizierten Feldern durchzuführen.
Option 2: die Queryset Alternativ revidieren, können Sie mit einem queryset für alles beginnen und dann filtern dementsprechend
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
Dank Robert es perfekt .. In der ersten Option gearbeitet, wie gehe ich vor, wenn Ich möchte nur eine der Variablen größer als eine Zahl setzen? –
Gut zu helfen! In Bezug auf Ihre Frage können Sie die Abfrage ändern, indem Sie das Wörterbuch auf die gleiche Weise wie bei jedem anderen Wörterbuch ändern, indem Sie Bedingungen verwenden. Ich habe ein drittes Beispiel in meiner Beispielansicht gemacht, aber zögern Sie nicht, mich zu informieren, wenn Sie einen spezielleren Anwendungsfall haben, für den Sie erstellen möchten. –
Ja bitte ich werde mehr Hilfe brauchen, ich konnte nicht erreichen .. Das Beispiel ist das folgende, der Benutzer wird eine Zahl in das Formularfeld eingeben und abschicken. Das System sollte alle Elemente mit der folgenden Nummer abfragen und zurückgeben. –