2017-11-17 1 views
0

Ich möchte einen Filter in Django, die Form-Methode verwendet. Wenn der Benutzertyp de var es im Dataset abfragen sollte, dass var, wenn es leer gelassen wird, sollte alle Elemente bringen.Queryset in Django, wenn leeres Feld alle Elemente zurückgibt

Wie kann ich das tun?

: Ich bin in Django

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) 

Antwort

1

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 
+0

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? –

+0

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. –

+0

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. –

2

Eine einfachere und explizite Weise, dies zu tun wäre:

if request.GET.get('Var'): 
    data = models.objects.filter(Var=request.GET.get('Var')) 
else: 
    data = models.objects.all()