Как уже упоминал Аарон, вы должны взять текст запроса, который будет выполняться в базе данных, и использовать EXPLAIN (или другой метод) для просмотра плана выполнения запроса. Как только вы получите план выполнения запроса, вы сможете увидеть, что происходит в самой базе данных. Существует множество операций, выполнение которых обходится через процедурный код очень дорого, что очень просто для любой базы данных, особенно если вы предоставляете индексы, которые база данных может использовать для ускорения вашего запроса.
Если я правильно прочитал ваш вопрос, вы получаете набор результатов всех строк в таблице Soknad. Получив эти результаты обратно, вы используете метод filter (), чтобы урезать результаты в соответствии с вашими критериями. Если посмотреть на документацию по Django, похоже, что он будет выполнять фильтрацию в памяти, а не повторно запрашивать базу данных (конечно, это действительно зависит от того, какой слой доступа к данным вы используете, а не от самого Django).
Наиболее оптимальным решением было бы использование полнотекстового поискового движка (Lucene, ferret и т. Д.), Чтобы справиться с этим для вас. Если это недоступно или нецелесообразно, следующим лучшим вариантом будет создание предиката запроса (предложение WHERE) перед отправкой запроса в базу данных и позволить базе данных выполнить фильтрацию.
Однако, , как и во всех вещах, связанных с базой данных, реальный ответ - «это зависит». Лучшее предложение - опробовать несколько различных подходов с использованием данных, близких к производственным, и сравнить их как минимум за 3 итерации, прежде чем приступать к окончательному решению проблемы. Может быть так же быстро или даже быстрее фильтровать в памяти, а не фильтровать в базе данных.