Несколько параметров строки запроса - PullRequest
0 голосов
/ 11 ноября 2018

Я создал эту простую функцию поиска:

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 Post, где "title" - это "key_search" или "tagline" - «key_search» или «содержимое» - это «key_search»

Как я могу решить?

1 Ответ

0 голосов
/ 11 ноября 2018

Выше приведен неверный синтаксис Python, вы не можете помещать операторы между именованными параметрами.

Однако у Django есть Q объектов [Django-doc] для выражения «условий», так что вы можете заключить условия в объекты Q и использовать | оператор для выражения логического или, как:

from django.db.models import <b>Q</b>

posts = Blog.objects.filter(
    <b>Q</b>(title__icontains=querystring) |
    <b>Q</b>(tagline__icontains=querystring) |
    <b>Q</b>(contents__icontains=querystring)
)

Это приведет к тому, что запрос будет более или менее похож на:

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