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: invalid syntax

我确定查询对应于:

SELECT * FROM Post WHERE “title” 是 “key_search” 或 “tagline” 是 “key_search” 或 “contents” 是 “key_search”

我该如何解决?

4

1 回答 1

2

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

然而,Django 有Q对象 [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%"
于 2018-11-11T16:06:30.007 回答