На самом деле, стремясь к компактности и эффективности, вам удалось придумать ужасно неэффективный код.Это связано с тем, что когда вы ссылаетесь на p_audio
или not p_audio
, это приводит к тому, что этот набор запросов должен быть оценен - а поскольку вы не разрезали его до этого, это означает, что весь фильтр извлекается из базы данных - например, все plate
объекты, оканчивающиеся на mp3 и т. Д.
Прежде чем обращаться к значению этого запроса, убедитесь, что вы делаете срез для каждого запроса.Поскольку вас интересует компактность кода, вам, вероятно, сначала нужно нарезать [:1]
, чтобы получить набор запросов для одного объекта:
p_audio = plate.parts.filter(content__iendswith=".mp3")[:1]
p_video = not p_audio and plate.parts.filter(content__iendswith=".flv") [:1]
p_swf = not p_audio and not p_video and plate.parts.filter(content__iendswith=".swf")[:1]
, а остальные могут остаться прежними.
Изменить, чтобы добавить Поскольку вас интересует только первый элемент каждого списка, о чем свидетельствует тот факт, что вы передаете только [0]
из каждого элемента в контекст.Но в вашем коде not p_audio
ссылается на исходный, не нарезанный набор запросов: и для определения истинного / ложного значения qs Django должен оценить его, который получает все соответствующие элементы из базы данных и преобразует их в объекты Python.Поскольку вы на самом деле не хотите эти объекты, вы выполняете гораздо больше работы, чем вам нужно.
Обратите внимание, что он не запускается повторно каждый раз: только в первый раз, так как после первой оценки набор запросов кешируется внутри.Но, как я уже сказал, это уже больше работы, чем вы хотите.