Перенесите фильтрацию в БД: User.objects.filter(is_active=True). Чтобы сохранить исходный контракт возврата списка, оберните QuerySet в list; иначе можно вернуть ленивую выборку.
Оптимизация и рефакторинг функции получения активных пользователей
Перенесите фильтрацию в БД: User.objects.filter(is_active=True). Чтобы сохранить исходный контракт возврата списка, оберните QuerySet в list; иначе можно вернуть ленивую выборку.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Необходимо улучшить производительность и читаемость кода.
def get_users():
result = []
for user in User.objects.all():
if user.is_active == True:
result.append(user)
return result
Ответ
Перенесите фильтрацию в БД: User.objects.filter(is_active=True). Чтобы сохранить исходный контракт возврата списка, оберните QuerySet в list; иначе можно вернуть ленивую выборку.
Вариант с прежним типом результата:
def get_users():
return list(User.objects.filter(is_active=True))
БД вернёт только подходящие строки, вместо передачи всех пользователей и Python-фильтрации. Если вызывающему коду нужен дальнейший ORM-фильтр или пагинация, возвращайте сам QuerySet и явно измените контракт. Индекс по булевому полю не всегда полезен: при большом числе активных пользователей он может не ускорить выборку. Для больших результатов нужны ограничение или пагинация.