多个查询字符串参数

时间:2018-11-11 16:03:12

标签: django django-views django-2.1

我已经创建了这个简单的搜索功能:

def search(request):
    if "q" in request.GET:
        querystring = request.GET.get("q")
        print(querystring)
        if len(querystring) == 0:
            return redirect("/search/")
        posts = Blog.objects.filter(title__icontains=querystring | tagline__icontains=querystring | contents__icontains=querystring)
        context= {"posts": posts}
        return render(request, "kernel/search.html", context)
    else:
        return render(request, "kernel/search.html")

例如,当我仅使用一种条件时:

 posts = Blog.objects.filter(title__icontains=querystring) 

它告诉我正确的结果。但是,当我使用多个参数时,会出现 SyntaxError:无效的语法

我确定查询对应于:

  

SELECT * FROM从哪里“标题”为“ key_search”或“标语”为   “ key_search”或“ contents”是“ key_search”

我该如何解决?

1 个答案:

答案 0 :(得分:2)

以上是错误的Python语法,您不能在命名参数之间放置运算符。

但是Django具有Q objects [Django-doc]来表达“条件”,因此您可以将条件包装在Q对象中,并使用|运算符来表达逻辑或类似的内容:

from django.db.models import Q

posts = Blog.objects.filter(
    Q(title__icontains=querystring) |
    Q(tagline__icontains=querystring) |
    Q(contents__icontains=querystring)
)

这将导致查询看起来或多或少像:

SELECT *
FROM Post
WHERE "title" LIKE "%key_search%"
   OR "tagline" LIKE "%key_search%"
   OR "contents" LIKE "%key_search%"