RawQuerySet в Django
1. В Django при выполнении raw SQL-запроса (
При попытке использования его в шаблоне обнаружились странные грабли: если набор непустой, то итерации по нему успешно работают, данные извлекаются, всё как задумано.
А вот если пустой... то типичная проверка
Это какой-то известный баг, или я наступил на неизведанные грабли?
2. Для обхода этой вредности пришлось в программе вручную проверять размер возвращаемого набора, и если он 0, то передавать в шаблон сообщение об ошибке, а в шаблоне проверять на непустоту не сам набор, а это сообщение. Проверка выглядит так:
Для пустых наборов оно работает, а для непустых обнаружилось, что запрос к базе выполняется два раза. Я так понимаю, первый раз при преобразовании набора в список в этой проверке, второй - при итерациях по набору в шаблоне.
Некоторая логика в повторном выполнении запроса при каждом цикле итераций по его результатам есть, но я не встретил в документации описания этой фичи. Это действительно так задумано?
Для обычных QuerySet оно так же?
И как избежать повторного выполнения запросов, если по результатам надо пройтись больше одного раза? Достаточно ли будет, например, преобразовать его в список посредством list()?
queryset=Модель.objects.raw('SELECT ...') вместо обычного QuerySet возвращается RawQuerySet.При попытке использования его в шаблоне обнаружились странные грабли: если набор непустой, то итерации по нему успешно работают, данные извлекаются, всё как задумано.
А вот если пустой... то типичная проверка
{% if queryset %} срабатывает, хотя по идее не должна. Но итерации по пустому набору, естественно, не выполняются ни разу. Что ещё интереснее, {% queryset|length %} печатает не 0, как ожидалось, а пустую строку.Это какой-то известный баг, или я наступил на неизведанные грабли?
2. Для обхода этой вредности пришлось в программе вручную проверять размер возвращаемого набора, и если он 0, то передавать в шаблон сообщение об ошибке, а в шаблоне проверять на непустоту не сам набор, а это сообщение. Проверка выглядит так:
if len(list(queryset)): ...Для пустых наборов оно работает, а для непустых обнаружилось, что запрос к базе выполняется два раза. Я так понимаю, первый раз при преобразовании набора в список в этой проверке, второй - при итерациях по набору в шаблоне.
Некоторая логика в повторном выполнении запроса при каждом цикле итераций по его результатам есть, но я не встретил в документации описания этой фичи. Это действительно так задумано?
Для обычных QuerySet оно так же?
И как избежать повторного выполнения запросов, если по результатам надо пройтись больше одного раза? Достаточно ли будет, например, преобразовать его в список посредством list()?
