Как в Django (фильтр) вывести все записи совпадающие с запросом?

Вывести все записи совпадающие с запросом (частичное или полное совпадение), поиск проводится по нескольким полям. Например: Запрос: "Антон Сахаров стал доктором в прошлом году" Поля: name, surname, text, info, tag Запис в бд: 1)name = "Антон", surname="Иванов", text="Доктор наук уволился с работы", info= "Следующий год, год семьи"; 2)name = "Сергей", surname="Сахаров", text="Нынче тяжело работать", info= "Что-то там"; 3)name = "Герман", surname= "Петров", text="Погода плохая, идет дождь", info= "Следующий";

Должно выводится 1 и 2 (есть частичное совпадение)


Ответы (1 шт):

Автор решения: Andrey Maslov

Вариант 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)
→ Ссылка