Querysets ленивы, что означает, что они не вызывают базу данных, пока они не оценены.Один из способов, которым они могут быть оценены, состоит в их сериализации, что и делает cache.set
за кулисами.Так что нет, это не пустая трата времени: все содержимое вашей модели Турнира будет кэшировано, если вы этого хотите.Вероятно, это не так: и если вы отфильтруете набор запросов дальше, Django просто вернется в базу данных, что сделает все это немного бессмысленным.Вам следует просто кэшировать экземпляры модели, которые вам действительно нужны.
Обратите внимание, что третий пункт в вашем начальном наборе не совсем верный, в том смысле, что это не имеет ничего общего с Apache или предварительным форкингом.Просто представление является функцией, подобной любой другой, и все, что определено в локальной переменной внутри функции, выходит из области видимости, когда эта функция возвращается.Таким образом, набор запросов, определенный и оцененный внутри представления, выходит из области видимости, когда представление возвращает ответ, и при следующем вызове представления будет создан новый, то есть при следующем запросе.Это тот случай, когда вы обслуживаете Django.
Однако , и это важно, если вы сделаете что-то вроде установки вашего набора запросов в глобальную (на уровне модуля) переменную, она будет сохраняется между запросами .Большинство способов обслуживания Django, и это, безусловно, включает mod_wsgi, поддерживают процесс для многих запросов перед его повторной обработкой, поэтому значение набора запросов будет одинаковым для всех этих запросов.Это может быть полезно в качестве своего рода кеша, но трудно понять, как правильно, потому что вы не представляете, как долго будет длиться процесс, плюс, вероятно, параллельно будут выполняться другие процессы, которые имеют свои собственные версии этой глобальной переменной..
Обновлено, чтобы отвечать на вопросы в комментарии
Ваши вопросы показывают, что вы все еще не совсем поняли, как работают наборы запросов.Все дело в том, когда они оцениваются: если вы перечисляете, или итерируете, или нарезаете набор запросов, который оценивает его, и в этот момент выполняется вызов базы данных (здесь я считаю сериализацию при итерации), а результаты сохраняются ввнутренний кеш запросов.Итак, если вы уже выполнили одно из этих действий для своего набора запросов, а затем задали его для (внешнего) кэша, это не вызовет другой попадание в базу данных.
Но , каждая операция filter()
в наборе запросов, даже если она уже была оценена, является еще одним ударом по базе данных.Это потому, что это модификация основного SQL-запроса, поэтому Django возвращается в базу данных и возвращает новый набор запросов с собственным внутренним кешем.