Оптимизация и рефакторинг функции получения активных пользователей

Перенесите фильтрацию в БД: 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 и явно измените контракт. Индекс по булевому полю не всегда полезен: при большом числе активных пользователей он может не ускорить выборку. Для больших результатов нужны ограничение или пагинация.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее