Django - Итерация по необработанному запросу выполняется медленно

У меня есть запрос, который использует оконную функцию. Я использую необработанный запрос для фильтрации по этому новому полю, поскольку django не позволяет фильтровать по этой оконной функции (по крайней мере, в той версии, которую я использую).

Таким образом, это будет выглядеть примерно так (упрощенно):

# Returns 440k lines
user_files = Files.objects.filter(file__deleted=False).filter(user__terminated__gte=today).annotate(
        row_number=Window(expression=RowNumber(), partition_by=[F("user")], order_by=[F("creation_date").desc()]))

Я в основном пытаюсь получить последний не удаленный файл от каждого пользователя, который не завершен.

После этого я использую следующий необработанный запрос, чтобы получить то, что я хочу:

# returns 9k lines
sql, params = user_files.query.sql_with_params()
latest_user_files = Files.objects.raw(f'select * from ({sql}) sq where row_number = 1', params)

Если я запускаю эти запросы в базе данных, они выполняются довольно быстро (300 мс). Но как только я пытаюсь выполнить итерацию или даже просто распечатать их, на выполнение уходит очень много времени. Где-то от 100 до 200 секунд, хотя сам запрос занимает чуть меньше полсекунды. Может быть, я что-то упускаю? Является ли проблемой дополнительное поле row_number в необработанном запросе?

Спасибо за любые подсказки/ответы.

<
Вернуться на верх