Как реализовать собственный фильтр поиска - Django?

У меня есть модель Book:

class Book(models.Model):
    title = models.CharField()
    ...

HTML-форма:

<form type="get" action=".">
    <input id="search_box" type="text" name="search_box"  placeholder="Search..." >
    <button type="submit" >Submit</button>
</form>

Например: Пользователь вводит в форму некоторый текст: "Какой-то странный текст". Я хочу найти все книги, которые содержат хотя бы одно из этих слов в верхнем или нижнем регистре или некоторые фразы в этом тексте('Some', 'some', 'Strange', 'strange', 'text', 'text' или 'some strange', 'Strange text' и так далее). Как я могу это сделать?

Вы можете разделить поисковый запрос, чтобы получить слова, а затем сопоставить их с названием книги. Мы можем сделать это, построив объект Q [Django-doc], который будет представлять условие фильтрации:

from django.db.models import Q

query = request.GET.get('search_box')
books = Book.objects.all()
if query:
    query = query.split()
    q_obj = Q(
        *[Q(('title__icontains', item)) for item in query],
        _connector=Q.OR
    )
    books = Book.objects.filter(q_obj)

Если поле поиска заполнено, оно отфильтрует набор запросов books таким образом, чтобы в нем было хотя бы одно слово из запроса.

Вернуться на верх