使用多个字段搜索Django(构建对象列表)

时间:2016-07-20 10:22:29

标签: django search django-models django-forms django-views

我最近推出了一个简单的搜索到我正在处理的Django应用程序。搜索过滤以下模型的索引:

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

实施如下:

查看:

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")

模板/ HTML:

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

目前,此搜索任务名称,如果未搜索任何内容,则返回所有任务。但是,我想扩展搜索范围以搜索描述和类别,并且无法尝试在多个对象上定义过滤器。我尝试过以下所有内容:

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

我想在这里抓住重叠。

1 个答案:

答案 0 :(得分:2)

而不是使用+ use |

如果您希望获得task_name,task_description和类别不包含 q(q为敏感)的列表

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

如果您希望获得task_name,task_description和类别不包含 q(q不区分大小写)的列表

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

如果您希望获得task_name,task_description和类别包含 q(q为敏感)的列表

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

如果您希望获得task_name,task_description和类别包含 q(q为不敏感)的列表

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

|用于OR

&安培;用于AND