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