Я не знаю, почему это IntegerField; похоже, это определенно должно быть поле ForeignKey (User) - из-за этого вы теряете такие вещи, как select_related () и другие.
Что касается кеширования, многие базы данных не кешируют результаты - они (или, скорее, ОС) будут кешировать данные на диске, необходимые для получения результата, поэтому поиск во второй раз должен быть быстрее первого , но это все равно будет работать.
Кроме того, для поиска требуется еще и обход базы данных. По моему опыту, с Django выполнение поиска элемента может занять от 0,5 до 1 мс для команды SQL на локальном сервере Postgresql плюс иногда нетривиальные издержки QuerySet. 1 мс - это много, если вам это не нужно - сделайте это несколько раз, и вы сможете превратить 30 мс запрос в 35 мс.
Если ваш SQL-сервер не является локальным, и у вас действительно есть обходные пути в сети, цифры становятся больше.
Наконец, люди обычно ожидают, что доступ к собственности будет быстрым; если они достаточно сложны, чтобы вызывать запросы SQL, кэширование результата обычно является хорошей идеей.