Учитывая поисковый термин "большой файл, больше стола", как бы я искал 1) любой из результатов; и 2) все результаты.

Поиск, который я сейчас делаю:

results = Path.objects.filter(path__icontains=search)

Что мне нужно сделать, это что-то вроде:

results = Path.objects.filter(path__icontains=search.split())

Как бы я сделал оба из этих? (ИЛИ И И)

0
David542 25 Янв 2013 в 05:08

3 ответа

Лучший ответ

Первое, что вам нужно знать, это то, что вы фактически не обращаетесь к базе данных при фильтрации, поэтому вы можете выполнять фильтрацию несколько раз, не теряя при этом высокой производительности, первый подход может быть следующим:

results = Path.objects.all()
for s in search.split():
    results = results.filter(path__icontains = s)

То есть для AND и вы можете использовать аналогичный подход для или.

1
David542 25 Янв 2013 в 21:30

Создайте понимание списка и используйте функцию сокращения:

keywords = search.strip().split()
list_path_qs = [Q(path__icontains=x) for x in keywords]
final_q = reduce(operator.and_, list_path_qs)
results = Path.objects.filter(final_q)[:100]
0
David542 25 Янв 2013 в 01:19
from django.db.models import Q
from operator import or_

# AND - use argument unpacking
Path.objects.filter(*(Q(path__icontains=s)
                      for s in search.split()))

# OR - use reduce
Path.objects.filter(reduce(or_, (Q(path__icontains=s)
                                 for s in search.split())))
3
pyrospade 26 Янв 2013 в 02:23