Основная проблема здесь заключается в том, что вы используете and_
как оператор уменьшения, так что это означает, что вы указываете в качестве условия, что code_postal
должен начинаться с 78
и 95
одновременно.Никакой текст / число не может начинаться с 78
и 95
(и всех других значений) одновременно.
Вы можете легко исправить это, уменьшив значение с помощью or_
:
from operator import <b>or_</b>
query = reduce(<b>or_</b>, (Q(code_postal__startswith=item) for item in q))
result = Record14.objects.filter(query)
При этом, вероятно, лучше использовать регулярное выражение [wiki] здесь, например:
from re import escape as <b>reescape</b>
result = Record14.objects.filter(
code_postal<b>__regex= '^({})'.format('|'.join(map(reescape, q)))</b>
)
Для заданного вами списка q
, это приведет к регулярному выражению:
^(78|95|77|91|92|93|94|75|27|28|45|89|10|51|02|60|27)
Здесь ^
является начальным якорем, а канал действует как «объединение», поэтому это регулярное выражение ищет столбцы, начинающиеся с 78
, 95
, 77
и т. Д.