Выбор ответа Junior Django ORM и N+1 обновлено

values_list(flat=True)

Вопрос

Что вернёт User.objects.filter(is_active=True).values_list("email", flat=True)?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: QuerySet строк-email без создания объектов моделей. valueslist с одним полем и flat=True даёт плоскую последовательность значений.

Варианты ответа

  1. QuerySet строк-email без создания объектов моделейправильный ответ
  2. Список объектов User с загруженным полем email
  3. Словари вида {"email": ...} для каждого пользователя
  4. Одну строку со всеми email через запятую для рассылки

Разбор

values_list с одним полем и flat=True даёт плоскую последовательность значений. Модели не создаются, поэтому это быстрее и экономнее, когда нужны только значения, например для рассылки. Словари возвращает values(). Результат по-прежнему ленивый QuerySet, а не готовый список.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.