2016-07-20 9 views
0

Ich habe kürzlich eine einfache Suche in eine Django-Anwendung, an der ich arbeite, eingeführt. Die Suchfilter einen Index von folgendem Modell:Suche mit mehreren Feldern Django (Erstellen der Objektliste)

class Task(models.Model): 
    task_name = models.CharField(max_length=140) 
    task_description = models.TextField() 
    category = models.CharField(max_length=140) 

Und wird wie folgt implementiert:

Ausblick:

def ViewAllTasks(request): 

    if 'q' in request.GET and request.GET['q']: 
     q = request.GET['q'] 
     tasks_list = task.objects.filter(task_name__contains=q) 
    else: 
     tasks_list = task.objects.all().order_by("task_name") 

Template/HTML:

<div class="col-lg-2"> 
     <form action="/tasks" method="get"> 
      <input type="text" name="q"> 
      <input type="submit" value="Search"> 
     </form> 
    </div> 

Derzeit wird diese Suche auf dem Task-Namen und gibt alle Aufgaben zurück, wenn nichts gesucht wird. Ich möchte jedoch die Suche auf die Beschreibung und die Kategorie erweitern und habe Schwierigkeiten, einen Filter für mehrere Objekte zu definieren. Ich habe alles einschließlich der folgenden getestet:

tasks_list = task.objects.filter(~Q(task_name__contains=q) + ~Q(task_description__contains=q) + ~Q(category__contains=q)) 

Ich möchte die Überlappung hier zu fangen.

Antwort

1

Anstelle der + Verwendung |

Wenn Sie die Liste erhalten möchten, wo die die task_name, task_description und Kategorie nicht q (q Sein Fall empfindliche)

tasks_list = Task.objects.filter(~Q(task_name__contains=q) | ~Q(task_description__contains=q) | ~Q(category__contains=q)) 

nicht enthält Wenn Sie möchten, erhalten Sie die Liste, wo die die task_name, task_description und Kategorie nicht enthält q (q Wesen Groß- und Kleinschreibung)

tasks_list = Task.objects.filter(~Q(task_name__icontains=q) | ~Q(task_description__icontains=q) | ~Q(category__icontains=q)) 

Wenn Sie wollen yo u die Liste, wo die die task_name, task_description und Kategorie enthält q (q Sein Fall empfindliche)

tasks_list = Task.objects.filter(Q(task_name__contains=q) | Q(task_description__contains=q) | Q(category__contains=q)) 

Wenn Sie möchten, dass Sie die Liste erhalten, wo die die task_name, task_description und Kategorie enthält q (q Sein Fall unempfindlich)

tasks_list = Task.objects.filter(Q(task_name__icontains=q) | Q(task_description__icontains=q) | Q(category__icontains=q)) 

| für für OR

& verwendet UND

+0

Was für eine großartige Antwort wird verwendet! Vielen Dank! – NickP

Verwandte Themen