Как в Django (фильтр) вывести все записи совпадающие с запросом?
Вывести все записи совпадающие с запросом (частичное или полное совпадение), поиск проводится по нескольким полям. Например: Запрос: "Антон Сахаров стал доктором в прошлом году" Поля: name, surname, text, info, tag Запис в бд: 1)name = "Антон", surname="Иванов", text="Доктор наук уволился с работы", info= "Следующий год, год семьи"; 2)name = "Сергей", surname="Сахаров", text="Нынче тяжело работать", info= "Что-то там"; 3)name = "Герман", surname= "Петров", text="Погода плохая, идет дождь", info= "Следующий";
Должно выводится 1 и 2 (есть частичное совпадение)
Ответы (1 шт):
Вариант 1. совпадение по любому из слов
from django.db.models import Q
q_list = Q()
for word in 'текст для поиска'.split():
q_list |= Q(name__icontains=word)
q_list |= Q(surname__icontains=word)
q_list |= Q(text__icontains=word)
queryset = ModelName.objects.filter(q_list)
Только нужно учитывать, если используешь SQlite, то там, насколько я помню, не работает поиск без учета регистра для кириллицы
подробней про Q() можно почитать: https://docs.djangoproject.com/en/3.0/topics/db/queries/#complex-lookups-with-q-objects
Вариант 2. Если я правильно понял, то получается, нужно что бы каждое из слов было в результирующем запросе хоть в одном из полей, тогда можно попробовать вот так:
from django.db.models import Q
queryset = ModelName.objects.all()
for word in 'текст для поиска'.split():
q_list = Q()
q_list |= Q(name__icontains=word)
q_list |= Q(surname__icontains=word)
q_list |= Q(text__icontains=word)
queryset = queryset.filter(q_list)